9

Javaで文字列のハッシュコードを使用して、その文字列を再作成する方法はありますか?

たとえば、次のようなものです。

String myNewstring = StringUtils.createFromHashCode("Hello World".hashCode());
if (!myNewstring.equals("Hello World"))
    System.out.println("Hmm, something went wrong: " + myNewstring);

文字列を整数値に変換し、その整数値からその文字列を再構築する必要があるため、これを言います。

4

6 に答える 6

6

不可能だよ。String のハッシュ コードは非可逆です。多くの文字列値は同じハッシュ コードになります。整数には 32 のビット位置があり、各位置には 2 つの値があります。32 文字の文字列 (たとえば) (各文字には多くの可能性がある) だけでも、衝突なしで 32 ビットにマップする方法はありません。彼らはちょうど収まりません。

任意精度の演算 (BigInteger など) を使用する場合は、各文字を整数として取得し、それらをすべて連結することができます。ほら。

于 2011-06-13T18:31:42.260 に答える
4

いいえ。複数の文字列が同じハッシュ コードを持つことができます。理論的には、そのハッシュ コードを持つすべての文字列を作成できますが、ほぼ無限になります。

于 2011-06-13T18:31:43.700 に答える
2

無理ですよね。考えてみてください。ハッシュコードは長い値、つまり 8 バイトです。文字列はこれより短いかもしれませんが、もっと長くなる可能性もあります。何かを失うことなく、より長い文字列を 8 バイトに詰め込むことはできません。

私の記憶が正しければ、Java ハッシュコード アルゴリズムは 8 バイトごとに合計するので、8 バイトのうち 7 バイトを失うことになります。文字列がすべて非常に短い場合は、何も失うことなく int または long としてエンコードできます。

于 2011-06-13T18:34:14.663 に答える
0

文字列が文字、数字、句読点のみで構成されていると仮定すると、約70文字の文字が可能になります。

log_70{2^32} = 5.22...

これは、任意の整数に対して、ハッシュコードとしてこれを含む5文字または6文字の文字列が見つかることを意味します。したがって、取得"Hello World":不可能; 運が"Hello"良ければうまくいくかもしれません。

于 2012-08-14T11:58:14.960 に答える