8

Haskell 和 Python 似乎对 Murmurhash2 的结果不一致。Python、Java 和 PHP 返回相同的结果,但 Haskell 没有。我对 Haskell 上的 Murmurhash2 做错了吗?

这是我的 Haskell Murmurhash2 代码:

import Data.Digest.Murmur32

    main = do
    print $ asWord32 $ hash32WithSeed 1 "woohoo"

这是用 Python 编写的代码:

import murmur

if __name__ == "__main__":
    print murmur.string_hash("woohoo", 1)

Python 返回 3650852671 而 Haskell 返回 3966683799

4

2 回答 2

5

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

因此,它们产生不同的结果也就不足为奇了。

于 2013-05-03T16:07:21.113 回答
3

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

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

于 2013-05-04T17:51:48.047 回答