FNV哈希算法【学习】

FNV哈希算法【学习】我这个人习惯现学现卖 上一篇 AC 自动机就是 刚才看看浏览次数七十多了 虽然写的不详细 不禁惭愧 希望对其他人能有帮助 哪怕是微乎其微的

大家好,欢迎来到IT知识分享网。

我这个人习惯现学现卖,上一篇AC自动机就是,刚才看看浏览次数七十多了(虽然写的不详细),不禁惭愧,希望对其他人能有帮助(哪怕是微乎其微的)。

最近两天在学习哈希算法,从一个英文网站上(只要不嫌麻烦的一句一句翻译英文,读起来还是很爽的)。

市面上的哈希算法应该有很多种。FNV是第一种我真正接触哈希算法,算法简单。

简单介绍一下(其实就是翻译一下,汗!):

  FNV哈希函数,有三种FNV-0(已废弃),FNV-1, FNV-1a。

  FNV-1和FNV-1a算法对于最终生成的哈希值(hash)有一定限制

  1,hash是无符号整型

  2,hash的位数(bits),应该是2的n次方(32,64,128,256,512,1024),一般32位的就够用了。

  FNV-1形式:

hash = offset_basis for each octet_of_data to be hashed hash = hash * FNV_prime hash = hash xor octet_of_data 

   FNV-1a形式:

hash = offset_basis for each octet_of_data to be hashed hash = hash xor octet_of_data hash = hash * FNV_prime return hash 

区别是有两句操作顺序调换,产生FNV-1a的原因是,有些人使用FNV-1a代替FNV-1发现算法离散性或CPU利用效率更好(我感觉应该没什么太大差距,只是微小的)。

for each octet_of_data to be hashed 意思是对于你要算哈希值的数,它的每一个字节。

hash = hash * FNV_prime,是包含取模运算的,具体看你采用多少位的哈希函数。例如,你用32为哈希,hash = hash * FNV_prime % (2的32次方);

hash = hash xor octet_of_data,意思是把当前取来的字节和当前的hash值的第八位做抑或运算。

32 bit
FNV_prime = 2
24 + 2
8 + 0x93 =

64 bit FNV_prime = 2 40 + 2 8 + 0xb3 = 11

128 bit FNV_prime = 2 88 + 2 8 + 0x3b = 81371

256 bit FNV_prime = 2 168 + 2 8 + 0x63 =

512 bit FNV_prime = 2 344 + 2 8 + 0x57 =
005
59

1024 bit FNV_prime = 2 680 + 2 8 + 0x8d =
474
271
3












  以上这几个数都是质数(哈希的理论基石,质数分辨定理,我理解也不深),不用管为什么,用的时候照搬就是了。

  

 如果我想得到的哈希位数不是上面几种呢?

  比如我想得到24位的哈希值,方法:取上面比24大的最小的位数,当然是32了,先算对应32位哈希值,再转换成24位的。

  转换方法:32 – 24 = 8, 好了把得到的32砍成两段,高8位最和低24位。第8位与低24位中的低8位做抑或,得到的24位值是最终结果。(hash>>24) ^ (hash & 0xFFFFFF);
 如果我想得到的哈希值不能用位数来表示呢?

  比如想得到范围在0~9999的哈希值,方法:取上面比9999大的最小的位数,当然是32,先算对应32位哈希值,再mod(9999 +1)。简单吧!!

  其实还有一种方法,可以避免上面方法出现的某些问题(映射分布有点儿不均匀,这个问题在一般情况下不用考虑,所以方法也不介绍了,有兴趣可以去网站上看看)。

http://www.isthe.com/chongo/tech/comp/fnv/index.html 




免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/136994.html

(0)
上一篇 2025-06-23 19:15
下一篇 2025-06-23 19:20

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信