正确实施番石榴的MurMurHash

时间:2015-08-09 03:32:25

标签: java hash guava hashcode

我是初级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);
  }
};

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

我希望得到关于此的指导解释。

1 个答案:

答案 0 :(得分:1)

你实际上 没有使用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