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 に基づいてa を生成する方法です。locateNodeIndexForHashing#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

行オブジェクトと列オブジェクトのハッシュを何らかの形で生成する必要があります。データをシリアル化し、クラスのハッシュ関数の 1 つを使用するか、より高速なハッシュ実装を使用して、ファクトリの 1 つで をHashing構築することができます。HashCodeメソッドfromIntfromLongfromBytesまたはfromString

IDE を使用してオブジェクトの Java hashCode メソッドを生成し、HashCode.fromInt()ファクトリ メソッドを使用して Google HashCode オブジェクトを構築するだけです。
これは、文字列をシリアライズして暗号化ハッシュを使用するよりもはるかに高速です。
どちらのオプションを使用する場合でも、オブジェクトに同じデータが含まれている場合、作成するハッシュコードが同じであることを確認する必要があります。
たとえば、toStringメソッドをオーバーライドしてすべてのオブジェクト データのテキスト表現を提供しない限り、メソッドの結果のハッシュは機能しません。オーバーライドしないと、インスタンスごとに常に異なるオブジェクト識別子を取得するだけで、「一貫した」ハッシュの目的がデフォルトになります。

于 2015-12-31T03:40:39.077 に答える