如何生成HashCode以调用google/guava的Hashing#consistentHash?

How to generate HashCode in order to call Hashing#consistentHash of google/guava?

google/guava@GitHub, the class Hashing has implemented consistent hashing@wiki. The method consistentHash requires a 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);
}

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

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

HashCode h = Hashing.murmur3_32().newHasher()
  .putString(row.getString(), StandardCharsets.UTF_8)
  .putString(col.getString(), StandardCharsets.UTF_8)
  .hash()

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

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