簡述FNV Hash算法

哈希算法在我們生活中的應(yīng)用十分廣泛,被廣泛應(yīng)用于信息安全、數(shù)據(jù)校驗、身份認證等領(lǐng)域。而哈希算法也不是只有SHA家族、MD家族,還有比較小眾的哈希家族,下面我們就來了解一下FNV Hash算法。

FNV Hash算法簡介

FNV Hash算法的全稱為Fowler-Noll-Vo算法,它是以三維發(fā)明人Glenn Fowler、Landon Curt Noll和Phong Vo的名字來命名的。

第一版FNV Hash算法是在1991年提出的,而目前,F(xiàn)NV Hash算法擁有3個版本,分別是FNV-0(已廢棄)、FNV-1以及FNV-1a。這3個算法的結(jié)構(gòu)十分相似,只是更換了計算步驟。

FNV Hash算法

FNV Hash的算法結(jié)構(gòu)

總體來說,F(xiàn)NV-0、FNV-1以及FNV-1a都有兩個參數(shù),第一個是OFFSET(初始的哈希值),第二個是一個PRIME(素數(shù))。

對于FNV-0來說,OFFSET為0,PRIME和FNV-1一致,其計算流程也和FNV-1一致。而FNV-1和FNV-1a的區(qū)別在于先算異或還是先算乘法,其他的方面也都相同。FNV-1和FNV-1a算法流程如下圖所示:

FNV Hash算法

FNV-1a相比FNV-1,散列分布更好,也有人認為FNV-1a在進行小數(shù)據(jù)(小于4個字節(jié))哈希時有更好的性能。但它們對于最終生成的哈希值都有一定限制:

  1. hash是無符號整型;
  2. hash的位數(shù)(bits),應(yīng)該是2的n次方(32,64,128,256……),一般來說,32位的就夠用了。

FNV Hash算法的優(yōu)缺點

FNV Hash算法計算耗時少,效率高,它可以快速hash大量的數(shù)據(jù)并保持較小的沖突概率,適合hash一些相近的字符串,比如IP地址、URL、文件名等等。

但是在數(shù)據(jù)量較大的運算場景中,由于缺乏良好的散列分布性能,使其不能夠在音頻等有聲內(nèi)容檢索時對數(shù)據(jù)進行準確定位。

免責聲明:素材源于網(wǎng)絡(luò),如有侵權(quán),請聯(lián)系刪稿。