我是一名初级Java开发人员,并且正尝试启动一个小型个人项目,以学习正确的做事方法(通常)。我开始搜索hash(),并在阅读article有关番石榴的好处时,偶然发现了MurMurHash,并且关于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的工作方式和/或如何使用它,尚无明确的解释。另外,我也不了解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的类的示例,当您调用hasher.putObject(object, funnelForObjectType)时,API在内部仅执行funnelForObjectType.funnel(object, hasher),并且一直在运行。

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

07-24 20:21