1

google/guava@GitHub中, Hashing类实现了一致的 hashing@wiki。该方法consistentHash需要一个HashCode对象:

public static int consistentHash(HashCode hashCode, int buckets) {
  return consistentHash(hashCode.padToLong(), buckets);
}

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

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);
}

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

4

2 回答 2

4

使用另一个HashFunction来散列行和列,例如

HashCode h = Hashing.murmur3_32().newHasher()
  .putString(row.getString(), StandardCharsets.UTF_8)
  .putString(col.getString(), StandardCharsets.UTF_8)
  .hash()
于 2015-12-31T03:30:20.427 回答
0

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

您可以简单地使用您的 IDE 为您的对象生成 Java hashCode 方法,然后使用HashCode.fromInt()工厂方法构建 google HashCode 对象。
这将比序列化字符串和使用加密哈希快得多。
无论您使用哪个选项,您都需要确保当对象中包含相同的数据时,您构建的哈希码是相同的。
例如,散列toString方法的结果将不起作用,除非您覆盖该方法并提供所有对象数据的文本表示。如果你不覆盖它,你只会得到每个实例之间总是不同的对象标识符,这将默认“一致”散列的目的。

于 2015-12-31T03:40:39.077 回答