我是初级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
是什么,所以我不知道应该将哪种数据作为第二个参数发送。
我希望得到关于此的指导解释。
答案 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
转换为基元序列,将它们放入知道如何接收基元的事物中;知道如何接收原语的东西的接口是PrimitiveSink
。 Hasher
是实现PrimitiveSink
的类的示例,当您调用hasher.putObject(object, funnelForObjectType)
时,API内部只执行funnelForObjectType.funnel(object, hasher)
,并继续运行。
只是一种将转换器从特定对象类型写入基元的方法,仅此而已。你永远不可能自己打电话给Funnel.funnel
;它只传递给putObject
个电话;你永远不需要传递自己的PrimitiveSink
。