ジョン:
ロバート・セッジウィックとケビンウェイン・Iによってアルゴリズム第四版を読むには、次の質問を見つけました:
ハッシュ攻撃:文字列のハッシュコード()の実装は以下の通りであるとすると、同一のハッシュコード()値を有する2 ^ N列、長さ2 ^ Nのそれぞれを、見つけます。
public int hashCode() {
int hash = 0;
for (int i = 0; i < length(); i++)
hash = (hash * 31) + charAt(i);
return hash;
}
強力なヒント:AAとBBが同じ値を持っています。
どのような私の心に来ることは長さ2 ^ Nのすべての可能な文字列を生成し、そのハッシュコードを比較しています。これは、しかし、大きなNのために非常に高価であり、私はそれが正解だ疑い。あなたは私が私が全体像で欠場何ヒントを与えることはできますか?
ruakh:
アンドレアスとGlainsの回答は両方とも正しいですが、彼らはあなたの目標は2つの生産することであるならば、あなたが必要なものはかなりありませんN長さ2の明確な文字列Nを。
むしろ、単純なアプローチは、連結の配列からのみからなる文字列を構築することであるAa
としますBB
。長さ2×1あなた有し{ Aa
、BB
}。長さは2×2のためには、{有し AaAa
、AaBB
、BBAa
、BBBB
}、長さが2×3のためにあなたが持っています{ AaAaAa
、AAaaBB
、AaBBAa
、AaBBBB
、BBAaAa
、BBAaBB
、BBBBAa
、BBBBBB
}。等々。
(注:文字列が長さ2持っている必要があります言うようにテキストを引用してきたNを、私はあなたが誤って引用することを推測している、そしてそれは実際に長さ2を求めています。N ;しかし、それは確かに長さ2を求めている場合はNのことができ、その後、あなたが進むにつれて、単純に要素をドロップします。)