Hash概念
hash也叫散列,就是把任意长度的输入,通过散列算法,变换成固定长度的输出.这个输出叫做散列值.这种转换是一种压缩映射.也就是散列值的空间通常远小于输入空间.不同的输入有可能会被映射成相同的散列值.所以是单向的映射.散列值相关联的表,称为哈希表
常用的散列算法(hash函数)
1 求余
index = value % 范围
2 斐波那契散列
index = (value*斐波那契) >>28
a 对于16位整数而言,这个乘数是40503
b 对于32位整数而言,这个乘数是2654435769
c 对于64位整数而言,这个乘数是11400714819323198485
3 MD5
index = md5(value)
a输出是128位,由4个32位字的级联组成
b具有很高的离散性
4 SHA1 (安全哈希算法)
index = SHA1(value)
aSHA可将一个最大2^64位(2305843009213693952字节)信息,转换成一串160位(20字节)的散列值
b具有很高的离散性
5 CRC32
index = CRC32(value)
a 4个字节(32位)长的CRC-32值
b 实际使用比较少
解决冲突的主要方法
冲突发生的原因
当输入的量级远大于哈希表的长度
解决方法
1 开放定址法
公式: hashindex = (hash(key) + di)%m
其中:
m= 哈希表长度
i= 1,2,3,…,k(k<=m-1)
di: 增量序列 线性探测再散列
向后移动 二次探测再散列
为随机数 随机探测再散列
2 拉链法
将冲突的记录放在同一个hash index线性链表里面
3 多次哈希法
用不同哈希函数多次哈希
缺点:插入和查找时计算时间增加
4 建立一个公共溢出区