散列函数

除余法

hash(key) = key % M

M为素数时,数据对散列表的覆盖最充分,分布最均匀


MAD法

除余法的缺陷:

1)不动点:无论表长M取值如何,总有hash(0) = 0

2)零阶均匀:[0,R)的关键码,平均分配至M个桶;但相邻关键码的散列地址也必相邻

一阶均匀:邻近的关键码,散列地址不再邻近

MAD = multiply-add-divide

取M为素数,a>0,b>0,a%M != 0

hash(key) = ( a * key + b )%M

特定场合下,未必需要高阶的均匀性


数字分析

抽取key中的某几位,构成地址。比如,取十进制表示的奇数位,hash(12345) = 135


平方取中

取key^2的中间若干位,构成地址。比如,hash(123) = 512  // 123^2 = 15129


折叠法

将key分割成等宽的若干段,取其总和作为地址。比如hash(123456789) = 1368 //123+456+789


位异或法

将key分割成等宽的二进制段,经异或运算得到地址。比如hash(110011011) = 110 //110 ^ 011 ^ 011


(伪)随机数法

(伪)随机数发生器

循环:rand(x+1) = [ a * rand(x) ] % M

径取:hash(key) = rand(key) = [rand(0) * a^key] % M

种子:rand(0) = ? 

(伪)随机数发生器的实现,因具体平台、不同历史版本而异,创建的散列表可移植性差

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • [TOC]本文转自其他人的博客。简化了一下,方便备忘。 概述 Hash一般翻译作散列也有直接音译作“哈希”。就是把...
    oceanLong阅读 865评论 0 0
  • Base64 base64是一种基于64个可打印字符来表示二进制数据的表示方法.严格来说它只能算作一种编码方式.B...
    miku酱啦阅读 1,232评论 0 3
  • mod一般取一个素数 解决冲突的方法: 1. 线性探查法 hash=H(key)+i如果找不到空位就再循环下去。 ...
    小幸运Q阅读 209评论 0 0
  • 说到散列,一般对应于散列表(哈希表)和散列函数。我们今天不谈哈希表,仅谈下散列函数。 定义 引一段百度百科关于散列...
    呼啸长风阅读 5,517评论 0 13
  • 为什么要有单向散列函数 作为接收者,如果将得到的密文正确解密,看到了明文。是否意味着这次加密传输是完全安全和正确的...
    JMasche阅读 2,453评论 0 3