首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >与Python mmh3库不匹配的Scala MurmurHash3库

与Python mmh3库不匹配的Scala MurmurHash3库
EN

Stack Overflow用户
提问于 2016-08-27 07:46:38
回答 2查看 1.7K关注 0票数 6

我需要在Python和Scala中使用MurmurHash字符串。然而,他们给出了截然不同的结果。Scala内置的MurmurHash3库似乎不能给出与我尝试过的任何其他库相同的结果,包括在线库。奇怪的是,它似乎只匹配一个字符,而不是多个字符。下面是一些示例:

Python:

代码语言:javascript
运行
复制
mmh3.hash('string', 0)
res: -1390314837

Scala:

代码语言:javascript
运行
复制
MurmurHash3.stringHash("string", 0)
res: 379569354

我尝试过使用有符号和无符号的int,因为我知道Java已经有了符号,而C实现python使用的是无符号的。但是,即使使用NumPy转换为带符号的整型,也无济于事。这个网站似乎同意python的实现:

http://murmurhash.shorelabs.com/

你知道这是怎么回事吗?

EN

Stack Overflow用户

发布于 2017-09-28 23:28:27

这是由于Scala的MurmurHash3.stringHashMurmurHash3.bytesHash在实现上的不同

MurmurHash3.bytesHash和python的mmh3.hash将字符以4为一组传递给散列混合器,而MurmurHash3.stringHash以两组为一组混合字符。这意味着这两个散列函数返回完全不同的输出:

代码语言:javascript
运行
复制
import scala.util.hashing.MurmurHash3

val testString = "FiddlyString"

MurmurHash3.stringHash(testString)           /* Returns an int */
MurmurHash3.bytesHash(testString.getBytes()) /* Returns a different int */

因此,如果您需要python和Scala的MurmurHash3值完全匹配的结果:

为了与mmh3.hash()

  • Use的MurmurHash3.stringHash

兼容,

  • 使用带有pymmh3.string_hash函数的MurmurHash3.bytesHash(myString.getBytes()),而不是MurmurHash3.stringHash()MurmurHash3.stringHash() MurmurHash3.stringHash

我建议使用第一种方法,特别是如果您的用例需要更好的性能,或者您需要散列大量的字符串

票数 3
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39176052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档