问题标签 [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.

0 投票
3 回答
917 浏览

node.js - 使用 Apache MurmurHash3.java x86 32 位方法具有负值

我必须使用 x86 32 位 murmurhash 来确定我在 Kafka 中发送消息的分区。另一个应用程序正在使用 NodeJS murmurhash.v3() 方法从预期的分区中获取消息。

我尝试了两种方法:

  1. 首先,我从https://svn.apache.org/repos/asf/mahout/trunk/math/src/main/java/org/apache/mahout/math/MurmurHash3.java获得了 Java 类
  2. 我还尝试用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 方法返回一个负值,这不是预期的(我猜)。

谁能告诉我我做错了什么?

0 投票
2 回答
2209 浏览

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的一个:http ://search-hadoop.com/c/HBase:hbase-common/src/main/java/org/apache/hadoop/hbase/util/MurmurHash3.java||server+void+% 2522哈希

上面相同的 Java 代码有很多版本。

这就是我调用 Java 的方式:

我从 Java 得到的输出:-1868221715

我从 C++ 3297211900 得到的输出

当我测试其他一些示例字符串时,例如“7c6c5be91430a56187060e06fd64dcb8”和“7e7e5f2613d0a2a8c591f101fe8c7351”,它们在 Java 和 C++ 中匹配。

任何指针表示赞赏

0 投票
2 回答
887 浏览

c - 哈希函数中的冲突太多

我试图将大约 6400 万个 64 位唯一无符号整数散列到 1.28 亿个桶(27 位宽地址)。我尝试了 Bob Jenkin 的HashLittleMurmur哈希(这两个哈希函数都提供了 32 位哈希,我将其屏蔽以获得 27 位地址)。在这两种情况下,它导致了大约 22% 的碰撞,最终只占用了 37% 的存储桶。这是预期的还是我做错了什么?我期待更少的碰撞和更好的水桶占用。

0 投票
1 回答
1940 浏览

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();

如果我在分区键上有两列怎么办?

两个字符串连接的哈希值不一样。

0 投票
1 回答
253 浏览

scala - 使用 sbt 交叉编译 Scala 时如何拥有不同的源代码?(MurmurHash 的变化)

我正在使用 SBT 0.13.2(也可以是 0.13.5),并且正在尝试为 2.10 编写一个项目并将其交叉编译为 2.9 和 2.10。它使用scala.util.hashing.MurmurHash32.9 中不存在的;而是有scala.util.MurmurHash(可能不兼容???)。我的来源需要不同来处理不同地方和不同接口的导入。我想我需要有两个不同的.scala文件,并以某种方式告诉 SBT.scala在为 2.9 编译时编译一个文件,.scala为 2.10 编译另一个文件。我该怎么做呢?

谢谢。

0 投票
7 回答
11248 浏览

performance - 在 SHA-1 附近具有碰撞可能性的快速哈希函数

我正在使用 SHA-1 来检测程序处理文件中的重复项。它不需要是加密强的,并且可能是可逆的。我找到了这个快速哈希函数列表https://code.google.com/p/xxhash/

如果我想要在 SHA-1 附近的随机数据上获得更快的函数和冲突,我应该选择什么?

也许 128 位散列足以用于文件重复数据删除?(与 160 位 sha-1 相比)

在我的程序中,哈希是根据 0 - 512 KB 的块计算的。

0 投票
2 回答
4651 浏览

java - Murmur3 在 Python 和 Java 实现之间散列不同的结果

我有两个不同的程序希望分别在 Python 和 Java 中使用 Murmur3 对相同的字符串进行哈希处理。

Python 2.7.9 版:

给出 79267961763742113019008347020647561319L。

Java是番石榴18.0:

给出字符串“6778ad3f3f3f96b4522dca264174a23b”,转换为 BigInterger 给出 137537073056680613988840834069010096699。

如何从两者中获得相同的结果?

谢谢

0 投票
2 回答
1578 浏览

scala - 来自 Scala 和 Guava 的 Murmur3 的不同结果

我正在尝试使用 Murmur3 算法生成哈希。哈希是一致的,但它们是 Scala 和 Guava 返回的不同值。

为什么我得到不同的哈希值?

0 投票
1 回答
264 浏览

performance - 在键值存储中使用哈希作为 ID

我想知道在像 Hazelcast 这样的键值存储中使用哈希(CityHash、Murmur 等)作为键是否是个好主意。我预计数据库中有大约 2,000,000,000 条记录 (URL),因此可能会发生冲突。通过哈希冲突丢失一些数据并不是非常关键,但当然最好避免它们。

一条记录包含 URL、时间戳、状态码。主要操作是插入和查找 URL 是否已经存在。

那么,鉴于速度是相关的,你会建议什么:

  • 使用ID 生成器,或
  • 使用诸如 CityHash 或 Murmur 之类的哈希算法,或
  • 使用相关的字符串,在这种情况下是 URL 本身?
0 投票
1 回答
727 浏览

delphi - MurMurHash3 是否有任何 Delphi 实现?

MurMurHash 3 是否有任何 Delphi 实现?我尝试自己实现它,但我的实现实际上比MurMurHash2慢。正常吗?还有其他实现吗?

这是我的:

免责声明:我不知道Seed值是否正确。