我正在尝试3种不同的FNV1A_64哈希实现。
1)Maatkit
SELECT FNV1A_64('1')
结果:-5808609649712063748
2)pyhash
import pyhash
hasher = pyhash.fnv1a_64()
print hasher('1')
结果:53876069782339L
3)fnv
./fnv1a64 -s 1
结果:0xaf63ac4c86019afc(小数12638134423997487000)
为什么所有的结果都不一样?
最佳答案
MySQL和命令行程序给出了相同的结果。一个只打印了一个有符号的数字,另一个打印了相同数字的十六进制表示。
>>> import struct
>>> struct.pack('q', -5808609649712063748)
'\xfc\x9a\x01\x86L\xacc\xaf'
>>> struct.unpack('Q', _)
(12638134423997487868L,)
>>> 0xaf63ac4c86019afc == _[0]
True
然而,Python需要
FNV1A_64_INIT
,因为它在默认情况下没有被传递。>>> FNV1A_64_INIT = 0xcbf29ce484222325
>>> import pyhash
>>> hasher = pyhash.fnv1a_64()
>>> hasher('1', seed=FNV1A_64_INIT)
12638134423997487868L
>>> _ == 0xaf63ac4c86019afc
True