Hash——初识

什么是哈希函数

	哈希(Hash)函数是一个映象,即: 将关键字的集合映射到某个地址集合上,它的设置很灵活,只要这个地址集合的大小不超出允许范围即可;
 任意长度的输入,通过哈希算法,变换成固定长度的输出,所输出的称为哈希值。
 这种变换是一种压缩映射,也即哈希值所占的空间一般来说远小于输入值的空间,不同的输入可能会哈希出相同的输出(概率很小)。

哈希表

散列表(Hash table,也叫哈希表),是根据键--码值(Key value)而直接进行访问的数据结构。
也就是说,它通过把键--码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。

哈希映射和冲突

哈希的本质就是数学,简单来说哈希函数实现了各种长度和形式的输入经过公开的哈希函数的运算生成一个固定长度的串,并且这个过程是单向不可逆的,也就是无法从哈希生成的串逆转为最初的输入。
输入是无穷尽的,生成的哈希串长度是固定的,那么必然面临着多个不一样的输入被映射压缩为一个相同的哈希串,就是无限集合映射有限集合导致的哈希碰撞或者叫哈希冲突。

哈希算法的特点

 快速性,效率高
 不可逆性
 敏感性
 低碰撞性(链表)

JAVA中的Hash算法

①hashMap   侧重点是速度
②Object.hashCode  直接获取内存地址
③Integer.hashCode  直接返回intValue
④String.hashCode  根据字符串内容生成hashCode,字符串一样则hashCode也相同
其他场景的Hash算法:MD4、MD5 	SHA( SHA-1、SHA-256)

Hash算法的用途

1.哈希查找、哈希表
2.秒传
3.HashMap
4.加解密,数字签名,MD5,SHA
5.Git(一种分布式的版本管理系统)
6.比特币,区块链

HashMap

HashMap 数据结构为 数组+链表,其中:
链表的节点存储的是一个 Entry 对象,每个Entry 对象存储四个属性(hash,key,value,next)

在这里插入图片描述

整体是一个数组;
数组每个位置是一个链表;
链表每个节点中的Value即我们存储的Object;

扩容机制:

HashMap 使用 “懒扩容” ,只会在 PUT 的时候才进行判断,然后进行扩容。
将数组长度扩容为原来的2 倍
将原来数组中的元素进行重新放到新数组中

在这里插入图片描述

有四个节点,它们的哈希值分别为3、11、19、27,若初始容量为8,这四个节点都位于下标为3的位置,在扩容之后,哈希表容量变为16,
因为3 & 8 == 0,19 & 8 == 0,所以,这两个节点仍然在新table下标为3的位置,但是11 & 8 != 0,27 & 8 != 0,
所以,这两个节点会在新table下表为(3+8) = 11的位置,我们验证一下:11 & (16 - 1) = 11,27 & (16 - 1) = 11,这两个节点确实应该在下标为11的位置。

生日碰撞

问题:假定一个班级中有50个人,则有两个人生日相同的概率为多大?
【错误方式】如果没有经过严密的数学推导,很多人第一反应为 50/365=10/73,大概七分之一,由此看来发生的概率比较小。
【正确方式】实际上,如果按照概率来看:设P为生日不在同一天的概率,则发生的概率为1-P
如果有三个人(n=3)的话,则概率P = 365/365 *364/365 * 363/365,以此类推通过公式可以计算得出:
当n=10时,P=88.3%,1-P=11.7%
当n=20时,P=58.8%,1-P=41.2%
当n=50时,P=2.9%,  1-P=97.1%
一般而言,对于总数为n的情况下,若要发生碰撞的概率大于50%,只需要发生   1.2*根号n  次,
例如:当n为100时,只需发生12次,就有50%可能发生碰撞

数字签名

不对称加密

所谓不对称加密,是对于对称加密而言的,传统的对称加密只有一个秘钥(你可以理解为密码),你用这个秘钥加密,别人也用这个秘钥解密,
这里面有个弊端就是,你把解密的密码告诉别人时,比如发短信、发微信,这时候回受到中间人攻击,简单举例说就是运营商等会看到你发的密码,然后你们之间的通讯数据就被解开。
不对称加密一个重要特点就是:公钥加密的数据私钥可以解密,私钥加密的数据公钥可以解密

数字签名

数字签名又是什么呢,其实也很简单了,大白话来讲也是一个加密解密过程,就是将数据用你的私钥进行加密,然后把明文和密文都发给对方,
对方用你的公钥对密文进行解密,然后比对解密后的明文是不是一样,这样就证明这个数据没有被第三方篡改,的确是你书写的
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值