FNV1A_64不匹配

时间:2012-10-25 22:17:30

标签: python mysql hash fnv

我正在尝试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十进制)

为什么所有结果都不同?

1 个答案:

答案 0 :(得分:7)

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