日常工作中经常会遇到哈希算法,出于好奇想多了解一些关于哈希的理论。
在Ceph中(一种分布式存储系统),从Object到PG的映射就是采用了一种哈希算法,名为“rjenkins”。所以就是从这里作为切入点,看了一些资料。
哈希算法的作用
哈希,也称作散列,它的作用其实就是通过一个函数(hash function),将输入值映射为一个输出的值,并且尽量保证这个映射是一对一的。
哈希算法的好坏
怎样的哈希算法才是一个好的哈希算法?从他的作用或者说目的上看,它最重要的衡量标准是是否有碰撞(collision),或者是否有尽可能少的碰撞。这里有个概念 funneling,翻译成中文是“漏斗效应”[注1],其实就是很多input被映射到少量的几个output上,产生了大量的碰撞。好的hash算法应该是可以通过测试或者理论证明这个算法是no funnel的。
这里有两个概念:完美哈希函数(PHF,Perfect Hash Function)和最小完美哈希函数(MPHF,Minimal Perfect Hash Function)。完美哈希函数,就是没有冲突的哈希函数,也就是将N个KEY值映射到M个整数上,这里M>=N,并且对于任意的KEY1,KEY2,H(KEY1)!=H(KEY2)。当M==N,则H是最小完美哈希函数。
当然它的另一个衡量标准是速度快,前提是在相同硬件条件下。也就是说每次哈希的运算次数少或者消耗的CPU指令周期少。
哈希模型
1 | initialize the internal state; |
也就是说一个hash过程主要包括:initialize, combine, mix, postprocess这几个过程。
参考
- Jenkins关于他新的hash算法以及相关理论的介绍
http://burtleburtle.net/bob/hash/evahash.html - 几种hash算法的对比
http://burtleburtle.net/bob/hash/examhash.html
附言:
好长时间没写东西了,今天来这里扫扫灰:)