5

私はハッシュベースのプログラムに取り組んでいます。私の質問は、文字列の HashCode がアプリケーション全体で同じままになるかどうかです。

Memcached サーバー内の KetamaMemcachedSessionLocator がこのように機能するため、これを尋ねた理由は、Memcache が実行されているサーバーが 2 つある場合、特定のサーバーからキーを検索したいからです。

String key = "MyString";
int keyid = key.hashCode();
int v = keyid % 1;  //( I assume that this will contact the First Server to retrieve that value )
int v = keyid % 2;  //( I assume that this will contact the Second Server to retrieve that value )
String value = MemcachedClient.get(key, v);

当サイトを参考に上記を実施

http://dev.mysql.com/doc/refman/5.0/en/ha-memcached-using-hashtypes.html

上記の方法で問題が発生した場合は、意見を共有してください。

4

2 に答える 2

10

ハッシュコード契約によると、次の場合は常に同じになりますstring1.eqauls(string2)

The java.lang.String hash function

高速な実装を提供するために、Java String クラスの初期のバージョンでは、文字列から選択される最大 16 文字を考慮した hashCode() 実装が提供されていました。一部の一般的なデータでは、これは非常にうまく機能せず、許容できないほどクラスター化された結果が得られ、その結果、ハッシュテーブルのパフォーマンスが低下しました。

Java 1.2 以降、java.lang.String クラスは、文字列のテキスト全体に対して積和アルゴリズムを使用して hashCode() を実装します。たとえば、java.lang.String クラスのインスタンス s が与えられた場合、ハッシュ コード h(s) は次のように定義されます。

h(s)=\sum_{i=0}^{n-1}s[i] \cdot 31^{n-1-i}

ここで、用語は Java 32 ビット int 加算を使用して合計されます。s[i] は文字列の i 番目の文字を表し、n は s の長さです。

一般的なハッシュ関数と同様に、衝突が発生する可能性があります。たとえば、文字列「FB」と「Ea」のハッシュ値は同じです。String の hashCode() 実装は素数 31 を使用し、'a' と 'B' の差はちょうど 31 であるため、計算は 70 × 31 + 66 = 69 × 31 + 97 です。

Collections Framework Enhancements in Java SE 7そこに変更があり、誰が知っているかを確認してください。

代替ハッシュ関数は、タイプ String のキーにのみ適用されます。

于 2012-10-28T07:02:01.553 に答える
1

はいといいえ。

コントラクトは、2 つのhashCode()等しい文字列が同じ JVM 内で同じハッシュ コードを持つことを指定します。つまり、文字列が変更されない限り、コードは変更されません。

一方、実際のhashCode()実装、ある JVM バージョンから別のバージョンへ、および/またはある JVM ベンダーから別の JVM ベンダーへと変更されています。たとえば、Oracle Java 7u6 は、特定のサイズを超える文字列に対してより高速な代替ハッシュ関数を提供します。現在は Collections フレームワーク内でのみ使用されていますが、Java 8 ではシステム全体のデフォルトになる可能性が非常に高いです。

基本的にhashCode()、同じアプリケーション内での一貫性は信頼できますが、異なるアプリケーション インスタンス間では信頼できません。ハッシュ コードを保存または共有する場合は、おそらく独自の関数を実装する必要があります。

もう 1 つの興味深い点はhashCode()、Java で定義されているように、intつまり 32 ビット長であるということです。これは決して一意の識別子ではありません。競合は非常に頻繁に発生するため、プログラマはそれらを処理する必要があります。ストレージ システムが一意のキーに依存している場合は、とにかくSHA-2などのより強力なハッシュ関数を使用することをお勧めします。

于 2012-10-28T07:17:57.803 に答える