我是一名初级 Java 开发人员,我正在尝试开始一个小型个人项目以学习正确的做事方式(一般来说)。我开始搜索有关 hash()
的内容,同时阅读 article关于 Guava 的好处,我偶然发现了 MurMurHash
,这个例子非常清楚 website ,但缺少一些我不明白的东西:Funnel
。
代码是这样的:
HashFunction hf = Hashing.md5();
HashCode hc = hf.newHasher()
.putLong(id)
.putString(name, Charsets.UTF_8)
.putObject(person, personFunnel)
.hash();
但是我必须定义一个 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);
}
};
虽然我搜索了有关如何使用它的更多信息或一般信息,但没有关于 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
转换为一系列原语,方法是将它们放入知道如何接收原语的事物中;知道如何接收原语的事物的接口(interface)是 PrimitiveSink
。 Hasher
是一个实现了 PrimitiveSink
的类的例子,当你调用 hasher.putObject(object, funnelForObjectType)
时,API 内部只是做funnelForObjectType.funnel(object, hasher)
,然后继续。
它只是一种编写从特定对象类型到基元的转换器的方法,仅此而已。您永远不可能自己调用 Funnel.funnel
;它只在那里传递给 putObject
调用;您永远不需要传递自己的 PrimitiveSink
。
关于java - 正确实现Guava的MurMurHash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31900613/