FNV哈希分为3个版本:fnv-0
(已废弃),FNV-1
,FNV-1a
hash = 0
for each byte_of_data to be hashed
hash = hash * FNV_prime
hash = hash ^ octet_of_data
return hash
hash = FNV_offset_basis
for each byte_of_data to be hashed
hash = hash * FNV_prime
hash = hash ^ byte_of_data
return hash
hash = FNV_offset_basis
for each byte_of_data to be hashed
hash = hash ^ byte_of_data
hash = hash * FNV_prime
return hash
这个参数的值是固定的,根据不同的位数选择不同的值作为hash的首次填充值
位数 | 十进制值 |
---|---|
32 | 2166136261 |
64 | 14695981039346656037 |
128 | 144066263297769815596495629667062367629 |
256 | 100029257958052580907070968620625704837092796014241193945225284501741471925557 |
512 | 965930312949666949800943540071631046609 041874567263789610837432943446265799458 293219771643844981305189220653980578449 5328239340083876191928701583869517785 |
1024 | 14197795064947621068722070641403218320 88062279544193396087847491461758272325 22967323037177221508640965212023555493 65628174669108571814760471015076148029 75596980407732015769245856300321530495 71501574036444603635505054127112859663 61610267868082893823963790439336411086 884584107735010676915 |
还没有看懂,不过这不影响我们实现通用32位,64位的FNV算法
位数 | 十进制值 |
---|---|
32 | 16777619 |
64 | 1099511628211 |
128 | 309485009821345068724781371 |
256 | 374144419156711147060143317175368453031918731002211 |
512 | 358359158748448673689190764 890951084499463279557543925 583998256154206699388825751 26094039892345713852759 |
1024 | 501645651011311865543459881 103527895503076534540479074 430301752383111205510814745 150915769222029538271616265 187852689524938529229181652 437508374669137180409427187 316048473796672026038921768 4476157468082573 |
hash后的最总结果
8位无符号整数
要加密的数据,需要转换成byte_of_data[]
然后循环^
计算