2012-02-16 8 views
5

私はにそれらの文字列を格納するために、文字列のためにlongのIDを生成するJavaアプリケーションを持っています。データの重複を避けるために、long整数に格納された各文字列のidを生成したいと思います。これは各文字列で一意でなければなりません。どうやってやるの ?文字列の長いハッシュを生成するにはどうすればよいですか?

+0

ストリングのハッシュを取得してネオに保管する前にそれらを長くキャストできませんでしたか? – Marthin

+5

"すべての文字列に対してユニーク"を達成することはできません - 長さは64ビット、長さは9ビット、長さは72ビットです。同じ長さにハッシュされる文字列があります – amit

+1

独自性を得ることはできません。無限に多くの弦と有限の長さしか持たない。より具体的にあなたが探しているものを記述できますか? – templatetypedef

答えて

4

longは64ビットです。長さ9のStringは72ビットを有する。 pigeon hole principleから - 9文字の長い文字列に対して一意のハッシングをlongに取得することはできません。

あなたはまだlongハッシュをしたい場合:あなただけString->inthash1()hash2()のための2つの標準的な[!異なる]ハッシュ関数を取ると計算できます。hash(s) = 2^32* hash1(s) + hash2(s)

6

文字列のhashcode()の機能を見て、代わりに長い値を使用するのはなぜですか?

Btw。各文字列に対して一意のIDを作成する方法があれば、すべての文字列を8バイトにまとめることができる圧縮アルゴリズムが見つかりました(定義では不可能)。多くの答えがあります

1

、以下を試してみてください。

あるいは、前に示唆したように、ソースをチェックアウト。

PS。もう1つの方法は文字列の辞書を維持することです:2 の文字列はすぐには得られないので、完全なマッピングができます。ただし、そのマッピングも大きなボトルネックになる可能性があります。

5

このコードはかなり良いハッシュを計算します:

String s = "some string"; 
long hash = UUID.nameUUIDFromBytes(s.getBytes()).getMostSignificantBits(); 
関連する問題