问题标签 [murmurhash]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
node.js - 使用 Apache MurmurHash3.java x86 32 位方法具有负值
我必须使用 x86 32 位 murmurhash 来确定我在 Kafka 中发送消息的分区。另一个应用程序正在使用 NodeJS murmurhash.v3() 方法从预期的分区中获取消息。
我尝试了两种方法:
- 首先,我从https://svn.apache.org/repos/asf/mahout/trunk/math/src/main/java/org/apache/mahout/math/MurmurHash3.java获得了 Java 类
- 我还尝试用Java翻译NodeJS murmurhash.v3()的JS代码(下表中的N到A列)
这是我用来从 Apache java 方法获取值的代码:
注意:目前,KAFKA_PARTITION_SEED = 100 但它只是一个测试值。未来将是 Long 值。
这是我完成的代码,从 NodeJS转换为 Java:
在这两种情况下,我在尝试获取分区值时都会得到相同的结果。分区值(下表中的P)是murmurhash方法返回值的模8(%8)。
这是我得到的结果示例:
关键 | 节点JS | 磷 | 阿帕奇 | 磷 | N 到 A | 磷 | 相同的
0009B5192951 | 1285784451 | 3 | 1285784451 | 3 | 1285784451 | 3 | 真的
0009B5192953 | 2252321193 | 1 | -2042646103 | -7 | -2042646103 | -7 | 错误的
0009B5192979 | 973658619 | 3 | 973658619 | 3 | 973658619 | 3 | 真的
0009B5192985 | 1359432313 | 1 | 1359432313 | 1 | 1359432313 | 1 | 真的
0009B5192987 | 3551230334 | 6 | -743736962 | -2 | -743736962 | -2 | 错误的
0009B5192995 | 199863683 | 3 | 199863683 | 3 | 199863683 | 3 | 真的
0009B5193001 | 1660947343 | 7 | 1660947343 | 7 | 1660947343 | 7 | 真的
0009B5193007 | 1980598253 | 5 | 1980598253 | 5 | 1980598253 | 5 | 真的
0009B5203789 | 1358113422 | 6 | 1358113422 | 6 | 1358113422 | 6 | 真的
0009B5203791 | 1339226023 | 7 | 1339226023 | 7 | 1339226023 | 7 | 真的
如您所见,在某些情况下,Apache murmurhash 方法返回一个负值,这不是预期的(我猜)。
谁能告诉我我做错了什么?
java - Java 和 C++ 之间的 Murmurhash3 没有对齐
我有 2 个独立的应用程序,一个是 Java,另一个是 C++。我同时使用 Murmurhash3。但是,在 C++ 中,对于相同的字符串,与 Java 相比,我得到了不同的结果
这是来自 C++ 的一个:https ://code.google.com/p/smhasher/source/browse/trunk/MurmurHash3.cpp?r=144
我正在使用以下功能:
上面相同的 Java 代码有很多版本。
这就是我调用 Java 的方式:
我从 Java 得到的输出:-1868221715
我从 C++ 3297211900 得到的输出
当我测试其他一些示例字符串时,例如“7c6c5be91430a56187060e06fd64dcb8”和“7e7e5f2613d0a2a8c591f101fe8c7351”,它们在 Java 和 C++ 中匹配。
任何指针表示赞赏
c - 哈希函数中的冲突太多
我试图将大约 6400 万个 64 位唯一无符号整数散列到 1.28 亿个桶(27 位宽地址)。我尝试了 Bob Jenkin 的HashLittle和Murmur哈希(这两个哈希函数都提供了 32 位哈希,我将其屏蔽以获得 27 位地址)。在这两种情况下,它导致了大约 22% 的碰撞,最终只占用了 37% 的存储桶。这是预期的还是我做错了什么?我期待更少的碰撞和更好的水桶占用。
algorithm - 具有复合键的 Cassandra 散列算法
我试图了解 Cassandra 使用什么算法来生成复合分区键的 murmur3 哈希。我知道我可以直接从 CQL 获取值,但我想直接从 Java/scala 代码中为任何给定元组重现 Cassandra 的行为。
对于简单的分区键,以下函数计算正确的值(至少在很多情况下,我通过查看源代码知道它不准确):
long l = com.google.common.hash.Hashing.Hashing.murmur3_128().hashString("my-string", Charset.forName("UTF-8")).asLong();
如果我在分区键上有两列怎么办?
两个字符串连接的哈希值不一样。
scala - 使用 sbt 交叉编译 Scala 时如何拥有不同的源代码?(MurmurHash 的变化)
我正在使用 SBT 0.13.2(也可以是 0.13.5),并且正在尝试为 2.10 编写一个项目并将其交叉编译为 2.9 和 2.10。它使用scala.util.hashing.MurmurHash3
2.9 中不存在的;而是有scala.util.MurmurHash
(可能不兼容???)。我的来源需要不同来处理不同地方和不同接口的导入。我想我需要有两个不同的.scala
文件,并以某种方式告诉 SBT.scala
在为 2.9 编译时编译一个文件,.scala
为 2.10 编译另一个文件。我该怎么做呢?
谢谢。
performance - 在 SHA-1 附近具有碰撞可能性的快速哈希函数
我正在使用 SHA-1 来检测程序处理文件中的重复项。它不需要是加密强的,并且可能是可逆的。我找到了这个快速哈希函数列表https://code.google.com/p/xxhash/
如果我想要在 SHA-1 附近的随机数据上获得更快的函数和冲突,我应该选择什么?
也许 128 位散列足以用于文件重复数据删除?(与 160 位 sha-1 相比)
在我的程序中,哈希是根据 0 - 512 KB 的块计算的。
java - Murmur3 在 Python 和 Java 实现之间散列不同的结果
我有两个不同的程序希望分别在 Python 和 Java 中使用 Murmur3 对相同的字符串进行哈希处理。
Python 2.7.9 版:
给出 79267961763742113019008347020647561319L。
Java是番石榴18.0:
给出字符串“6778ad3f3f3f96b4522dca264174a23b”,转换为 BigInterger 给出 137537073056680613988840834069010096699。
如何从两者中获得相同的结果?
谢谢
scala - 来自 Scala 和 Guava 的 Murmur3 的不同结果
我正在尝试使用 Murmur3 算法生成哈希。哈希是一致的,但它们是 Scala 和 Guava 返回的不同值。
为什么我得到不同的哈希值?
performance - 在键值存储中使用哈希作为 ID
我想知道在像 Hazelcast 这样的键值存储中使用哈希(CityHash、Murmur 等)作为键是否是个好主意。我预计数据库中有大约 2,000,000,000 条记录 (URL),因此可能会发生冲突。通过哈希冲突丢失一些数据并不是非常关键,但当然最好避免它们。
一条记录包含 URL、时间戳、状态码。主要操作是插入和查找 URL 是否已经存在。
那么,鉴于速度是相关的,你会建议什么:
- 使用ID 生成器,或
- 使用诸如 CityHash 或 Murmur 之类的哈希算法,或
- 使用相关的字符串,在这种情况下是 URL 本身?