哈希算法和隨機數字


讀者指南:

參考資料 : 
https://blog.csdn.net/axuanwu/article/details/26060711
 

哈希和隨機數的概念

哈希對信息計算得到一個位置信息,哈希不要求反向查找,哈希存在碰撞。
一個分布均勻的隨機函數是一個良好的哈希算法。
素數乘法有很好的的隨機性。 

哈希算法分類:

加法Hash;把輸入元素一個一個的加起來構成最后的結果
位運算Hash;這類型Hash函數通過利用各種位運算(常見的是移位和異或)來充分的混合輸入元素
乘法Hash;這種類型的Hash函數利用了乘法的不相關性(平方取中法,FNV算法)
除法Hash;除法和乘法一樣,同樣具有表面上看起來的不相關性。不過,因為除法太慢,這種方式幾乎找不到真正的應用
查表Hash;查表Hash最有名的例子莫過於CRC系列算法。雖然CRC系列算法本身並不是查表,但是,查表是它的一種最快的實現方式。查表Hash中有名的例子有:Universal Hashing和Zobrist Hashing。他們的表格都是隨機生成的。
混合Hash;混合Hash算法利用了以上各種方式。各種常見的Hash算法,比如MD5、Tiger都屬於這個范圍。它們一般很少在面向查找的Hash函數里面使用 
 

FNV算法

FNV-1和FNV-1a算法對於最終生成的哈希值(hash)有一定限制
  1,hash是無符號整型
  2,hash的位數(bits),應該是2的n次方(32,64),一般32位的就夠用了。

 

相關變量:
hash值:一個n位的unsigned int型hash值
offset_basis:初始的哈希值
FNV_prime:FNV用於散列的質數
octet_of_data:8位數據(即一個字節)

 

FNV-1描述:
hash = offset_basis
for each octet_of_data to be hashed
hash = hash * FNV_prime
hash = hash xor octet_of_data
return hash

 

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特點說明

FNV-1a和FNV-1的唯一區別就是xor和multiply的順序不同,他們所采用的FNV_prime和offset_basis都相同,有人認為FNV-1a在進行小數據(小於4個字節)哈希時有更好的性能。

FNV_prime的取值:
32 bit FNV_prime = 2^24 + 2^8 + 0x93 = 16777619
64 bit FNV_prime = 2^40 + 2^8 + 0xb3 = 1099511628211

offset_basis的取值:
32 bit offset_basis = 2166136261
64 bit offset_basis = 14695981039346656037


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM