java - 正确实现Guava的MurMurHash

标签 java hash guava hashcode

我是一名初级 Java 开发人员,我正在尝试开始一个小型个人项目以学习正确的做事方式(一般来说)。我开始搜索有关 hash() 的内容,同时阅读 article关于 Guava 的好处,我偶然发现了 MurMurHash,这个例子非常清楚 website ,但缺少一些我不明白的东西:Funnel

代码是这样的:

HashFunction hf = Hashing.md5();
HashCode hc = hf.newHasher()
       .putLong(id)
       .putString(name, Charsets.UTF_8)
       .putObject(person, personFunnel)
       .hash();

但是我必须定义一个 Funnel 来将对象类型分解为原始字段值,为此我必须

Funnel<Person> personFunnel = new Funnel<Person>() {
  @Override
  public void funnel(Person person, PrimitiveSink into) {
    into
      .putInt(person.id)
      .putString(person.firstName, Charsets.UTF_8)
      .putString(person.lastName, Charsets.UTF_8)
      .putInt(birthYear);
  }
};

虽然我搜索了有关如何使用它的更多信息或一般信息,但没有关于 Funnel 如何工作和/或我应该如何使用它的明确解释。另外我不明白 PrimitiveSink 是什么,所以我不知道应该将哪种数据作为第二个参数发送。

我将不胜感激对此的解释或指导。

最佳答案

您实际上不必Funnel 用于任何事情,但Funnel 只是一个对象,它表示如何将一个特定类型到一系列基元。没有什么特别的魔法。

Funnel<Person> personFunnel = new Funnel<Person>() {
  @Override
  public void funnel(Person person, PrimitiveSink into) {
    into
      .putInt(person.id)
      .putString(person.firstName, Charsets.UTF_8)
      .putString(person.lastName, Charsets.UTF_8)
      .putInt(birthYear);
  }
};

只是一个对象,它解释了如何将Person 转换为一系列原语,方法是将它们放入知道如何接收原语的事物中;知道如何接收原语的事物的接口(interface)是 PrimitiveSinkHasher 是一个实现了 PrimitiveSink 的类的例子,当你调用 hasher.putObject(object, funnelForObjectType) 时,API 内部只是做funnelForObjectType.funnel(object, hasher),然后继续。

只是一种编写从特定对象类型到基元的转换器的方法,仅此而已。您永远不可能自己调用​​ Funnel.funnel;它只在那里传递给 putObject 调用;您永远不需要传递自己的 PrimitiveSink

关于java - 正确实现Guava的MurMurHash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31900613/

相关文章:

java - 在 java 中初始化类时,创建 Collection 到 ImmutableSortedSet 的深拷贝

java - 对异步代码进行单元测试是一种好习惯吗?

java - 如何使用 XQuery 获取 XML 文件中的子节点数

java - Mule-使用CXF组件时出错

c# - 如何获取 user.config 路径中​​的哈希值?

c# sha256 使用用户名作为盐来计算密码哈希

java - Guava 中的 Floats.tryParse()

java - 如何使用 API 在新的 Google 电子表格中创建第一行?

java - 如何为在 equals() 中使用 OR 的对象创建哈希码?

java - ConcurrenLinkedtHashmap 迭代器提供的元素顺序取决于键大小?