正确实现Guava的MurMurHash

Implementing Guava's MurMurHash Properly

我是一名初级 Java 开发人员,我正在尝试开始一个小型个人项目以学习正确的做事方式(一般来说)。我开始搜索 hash() 并在阅读 article about the benefits of Guava, I stumbled upon MurMurHash and the example is very clear on it's website 时,但缺少一些我不理解的内容:Funnel.

代码如下:

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

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

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 工作原理的明确解释 and/or 我应该如何使用它。另外我不明白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 转换为原语序列,方法是将它们放入知道如何接收原语的事物中;知道如何接收原语的事物的接口是 PrimitiveSinkHasher 是实现 PrimitiveSink 的 class 的示例,当您调用 hasher.putObject(object, funnelForObjectType) 时,API 在内部只是执行 funnelForObjectType.funnel(object, hasher),并保持去。

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