2012-10-25 114 views
1

我正在尝试3种不同的实现FNV1A_64散列。FNV1A_64不匹配

1)Maatkit

SELECT FNV1A_64('1') 

结果-5808609649712063748

2)pyhash

import pyhash 
hasher = pyhash.fnv1a_64() 
print hasher('1') 

结果538760697823 39L

3)fnv

./fnv1a64 -s 1 

结果0xaf63ac4c86019afc(12638134423997487000十进制)

为什么所有的结果是不同的?

回答

6

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 
+2

你真了不起 – twoface88