首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何生成HashCode以调用谷歌/番石榴的Hashing#consistentHash?

如何生成HashCode以调用谷歌/番石榴的Hashing#consistentHash?
EN

Stack Overflow用户
提问于 2015-12-31 03:24:12
回答 2查看 1.2K关注 0票数 1

谷歌/番石榴@GitHub中,类散列实现了一致散列@wiki。方法consistentHash需要一个HashCode对象:

代码语言:javascript
复制
public static int consistentHash(HashCode hashCode, int buckets) {
  return consistentHash(hashCode.padToLong(), buckets);
}

我正在实现一个原型分布式密钥-值存储,并希望通过自定义Row密钥和Column密钥对密钥空间进行分区。

代码语言:javascript
复制
public int locateNodeIndexFor(Row r, Column c, int buckets) {
  HashCode hashCode = // How to generate a HashCode based on @param r and @param c?
  return Hashing.consistentHash(hashCode, buckets);
}

在这里,类Row (和类Column)只是String字段的包装器,并且有自己的hashCode()方法。我的问题是如何基于locateNodeIndexFor中的@param r和@param c生成一个Hashing#consistentHash,以便调用Hashing#consistentHash

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-31 03:30:20

使用另一个HashFunction对行和列进行散列。

代码语言:javascript
复制
HashCode h = Hashing.murmur3_32().newHasher()
  .putString(row.getString(), StandardCharsets.UTF_8)
  .putString(col.getString(), StandardCharsets.UTF_8)
  .hash()
票数 4
EN

Stack Overflow用户

发布于 2015-12-31 03:40:39

您需要以某种方式生成行和列对象的散列,可以通过序列化它们的数据和使用Hashing类中的一个散列函数来实现这一点,或者可以使用更快的哈希实现并使用工厂方法之一fromIntfromLongfromBytesfromString构建HashCode

您可以简单地使用您的IDE为您的对象生成一个Java hashCode方法,然后使用HashCode.fromInt()工厂方法来构建HashCode对象。

这将比序列化字符串和使用加密散列快得多。

无论您选择哪一个选项,都需要确保当对象中包含相同的数据时,您构建的哈希代码将是相同的。

例如,散列toString方法的结果将无法工作,除非您正在重写该方法并提供所有对象数据的文本表示。如果您不覆盖它,您将只获得对象标识符,它在每个实例之间总是不同的,这将默认“一致”散列的目的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34540588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档