我是一名初级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
转换为一系列原始元素,方法是将它们放入知道如何接收原始元素的事物中。知道如何接收原语的事物的接口是PrimitiveSink
。 Hasher
是实现PrimitiveSink
的类的示例,当您调用hasher.putObject(object, funnelForObjectType)
时,API在内部仅执行funnelForObjectType.funnel(object, hasher)
,并且一直在运行。这只是将转换器从特定对象类型转换为基元的一种方法,仅此而已。您永远不会自己打电话给
Funnel.funnel
;它只是传递给putObject
调用的地方;您永远不需要传递自己的PrimitiveSink
。