哈希算法在我们生活中的应用十分广泛,被广泛应用于信息安全、数据校验、身份认证等领域。而哈希算法也不是只有SHA家族、MD家族,还有比较小众的哈希家族,下面我们就来了解一下FNV Hash算法。

FNV Hash算法简介

FNV Hash算法的全称为Fowler-Noll-Vo算法,它是以三维发明人Glenn Fowler、Landon Curt Noll和Phong Vo的名字来命名的。

第一版FNV Hash算法是在1991年提出的,而目前,FNV Hash算法拥有3个版本,分别是FNV-0(已废弃)、FNV-1以及FNV-1a。这3个算法的结构十分相似,只是更换了计算步骤。

FNV Hash算法

FNV Hash的算法结构

总体来说,FNV-0、FNV-1以及FNV-1a都有两个参数,第一个是OFFSET(初始的哈希值),第二个是一个PRIME(素数)。

对于FNV-0来说,OFFSET为0,PRIME和FNV-1一致,其计算流程也和FNV-1一致。而FNV-1和FNV-1a的区别在于先算异或还是先算乘法,其他的方面也都相同。FNV-1和FNV-1a算法流程如下图所示:

FNV Hash算法

FNV-1a相比FNV-1,散列分布更好,也有人认为FNV-1a在进行小数据(小于4个字节)哈希时有更好的性能。但它们对于最终生成的哈希值都有一定限制:

  1. hash是无符号整型;
  2. hash的位数(bits),应该是2的n次方(32,64,128,256……),一般来说,32位的就够用了。

FNV Hash算法的优缺点

FNV Hash算法计算耗时少,效率高,它可以快速hash大量的数据并保持较小的冲突概率,适合hash一些相近的字符串,比如IP地址、URL、文件名等等。

但是在数据量较大的运算场景中,由于缺乏良好的散列分布性能,使其不能够在音频等有声内容检索时对数据进行准确定位。

免责声明:素材源于网络,如有侵权,请联系删稿。