Murmurhash 2的结果是Python和Haskell

Axe*_*nto 8 python hash haskell mismatch murmurhash

Haskell和Python似乎不同意Murmurhash2的结果.Python,Java和PHP返回相同的结果,但Haskell没有.关于Haskell上的Murmurhash2我做错了吗?

这是我的Haskell Murmurhash2的代码:

import Data.Digest.Murmur32

    main = do
    print $ asWord32 $ hash32WithSeed 1 "woohoo"
Run Code Online (Sandbox Code Playgroud)

这是用Python编写的代码:

import murmur

if __name__ == "__main__":
    print murmur.string_hash("woohoo", 1)
Run Code Online (Sandbox Code Playgroud)

Python返回3650852671,而Haskell返回3966683799

ham*_*mar 5

通过快速检查源,看起来算法一次以32位运行.Python版本通过简单地从输入字符串一次抓取4个字节来获取这些,而Haskell版本将每个字符转换为单个32位Unicode索引.

因此,它们产生不同的结果并不奇怪.


nom*_*olo 3

murmur-hash包(我是它的作者)不承诺计算与其他语言相同的哈希值。如果您依赖哈希值与其他计算哈希值的软件兼容,我建议您创建newtype包装器,以您想要的方式计算哈希值。特别是对于文本,您至少需要指定编码。在您的情况下,您可以使用 将文本转换为 ASCII 字符串Data.ByteString.Char8.pack,但这仍然不会给您相同的哈希值,因为该ByteString实例更多的是占位符。

顺便说一句,我没有积极改进该软件包,因为 MurmurHash2 已被 MurmurHash3 取代,但我继续接受补丁。