正确实现Guava的MurMurHash
Implementing Guava's MurMurHash Properly
我是一名初级 Java 开发人员,我正在尝试开始一个小型个人项目以学习正确的做事方式(一般来说)。我开始搜索 hash()
并在阅读 article about the benefits of Guava, I stumbled upon MurMurHash
and the example is very clear on it's 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 工作原理的明确解释 and/or 我应该如何使用它。另外我不明白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
的 class 的示例,当您调用 hasher.putObject(object, funnelForObjectType)
时,API 在内部只是执行 funnelForObjectType.funnel(object, hasher)
,并保持去。
它只是一种编写从特定对象类型到基元的转换器的方法,仅此而已。您永远不可能自己打电话给 Funnel.funnel
;它只能传递给 putObject
调用;你永远不需要传递你自己的 PrimitiveSink
.
我是一名初级 Java 开发人员,我正在尝试开始一个小型个人项目以学习正确的做事方式(一般来说)。我开始搜索 hash()
并在阅读 article about the benefits of Guava, I stumbled upon MurMurHash
and the example is very clear on it's 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 工作原理的明确解释 and/or 我应该如何使用它。另外我不明白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
的 class 的示例,当您调用 hasher.putObject(object, funnelForObjectType)
时,API 在内部只是执行 funnelForObjectType.funnel(object, hasher)
,并保持去。
它只是一种编写从特定对象类型到基元的转换器的方法,仅此而已。您永远不可能自己打电话给 Funnel.funnel
;它只能传递给 putObject
调用;你永远不需要传递你自己的 PrimitiveSink
.