1

FNV1A_64ハッシュの 3 つの異なる実装を試しています。

1)マートキット

SELECT FNV1A_64('1')

結果-5808609649712063748

2)パイハッシュ

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

結果53876069782339L

3) fnv

./fnv1a64 -s 1

結果: 0xaf63ac4c86019afc (12638134423997487000 10 進数)

すべての結果が異なるのはなぜですか?

4

1 に答える 1

7

MySQL とコマンド ライン プログラムで同じ結果が得られました。1 つは符号付きの数値を出力し、もう 1 つは同じ数値の 16 進表現を出力しました。

>>> import struct
>>> struct.pack('q', -5808609649712063748)
'\xfc\x9a\x01\x86L\xacc\xaf'
>>> struct.unpack('Q', _)
(12638134423997487868L,)
>>> 0xaf63ac4c86019afc == _[0]
True

FNV1A_64_INITただし、デフォルトでは渡されないため、Python では必須です。

>>> FNV1A_64_INIT = 0xcbf29ce484222325
>>> import pyhash
>>> hasher = pyhash.fnv1a_64()
>>> hasher('1', seed=FNV1A_64_INIT)
12638134423997487868L
>>> _ == 0xaf63ac4c86019afc
True
于 2012-10-25T22:39:54.117 に答える