python - FNV1A_64 不匹配

标签 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 十进制)

为什么所有的结果都不一样?

最佳答案

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

关于python - FNV1A_64 不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13078183/

相关文章:

ruby-on-rails - 如何一次获取多个哈希值?

python - 无需 IPC 通信即可共享对象

python - 使用 Pandas 创建交易假期日历

python - 如何从 Python 修改 SVG 文件的属性?

python - 在给定索引处将一些字符串插入给定字符串

php - 在 MySQL 中选择单行

php/mysql 如果为空则忽略输入

linux - 同时对同一个文件应用不同的哈希算法

mysql - 如何使用非英语(孟加拉语)语言将数据输入此数据库表?

ruby - 如何比较 Ruby 数组和散列的内容?