在谷歌/番石榴@GitHub中,类散列实现了一致散列@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);
}在这里,类Row (和类Column)只是String字段的包装器,并且有自己的hashCode()方法。我的问题是如何基于locateNodeIndexFor中的@param r和@param c生成一个Hashing#consistentHash,以便调用Hashing#consistentHash
发布于 2015-12-31 03:30:20
使用另一个HashFunction对行和列进行散列。
HashCode h = Hashing.murmur3_32().newHasher()
.putString(row.getString(), StandardCharsets.UTF_8)
.putString(col.getString(), StandardCharsets.UTF_8)
.hash()发布于 2015-12-31 03:40:39
您需要以某种方式生成行和列对象的散列,可以通过序列化它们的数据和使用Hashing类中的一个散列函数来实现这一点,或者可以使用更快的哈希实现并使用工厂方法之一fromInt、fromLong、fromBytes或fromString构建HashCode。
您可以简单地使用您的IDE为您的对象生成一个Java hashCode方法,然后使用HashCode.fromInt()工厂方法来构建HashCode对象。
这将比序列化字符串和使用加密散列快得多。
无论您选择哪一个选项,都需要确保当对象中包含相同的数据时,您构建的哈希代码将是相同的。
例如,散列toString方法的结果将无法工作,除非您正在重写该方法并提供所有对象数据的文本表示。如果您不覆盖它,您将只获得对象标识符,它在每个实例之间总是不同的,这将默认“一致”散列的目的。
https://stackoverflow.com/questions/34540588
复制相似问题