低セキュリティのキー生成に MD5 を使用するハッシュ アルゴリズムを作成しました。基本的に、文字列の文字を取得し、インデックス付きの積を合計してから、MD5 する前に乱数のモジュロを取得します。Java の場合:
BigInteger bi = BigInteger.ZERO;
char[] array = input.toCharArray();
for (int i = 0; i < array.length; i++) {
bi = bi.add(BigInteger.valueOf(i + 1).multiply(
BigInteger.valueOf(array[i])));
}
final int moduloOperator = 52665; // random constant
final byte[] moduloResult = bi.remainder(
BigInteger.valueOf(moduloOperator)).toByteArray();
MessageDigest md;
try {
md = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException nsae) {
nsae.printStackTrace();
return null;
}
md.update(moduloResult);
return new BigInteger(1, md.digest()).toString().substring(0, 7);
読みやすくする必要があるため、部分文字列を最後に付けています。
一見すると、意図したとおりに機能します。入力が異なれば出力も異なりますが、結果は実行間で一貫しています。
しかし、少し遊んでみると、次のことに気付きました。
hash("") = "1963546"
hash("1963546") = "1322048"
hash("1322048") = "2101764"
hash("2101764") = "3234562"
これまでのところ問題ないようです。適当にランダム。しかしその後:
hash("3234562") = "3234562"
hash("3234562") = "3234562" [etc.]
これは私を唖然とさせました。7 桁の数字のハッシュ自体が 1,000 万分の 1 の確率であると推測できます。これは本当に 5 回目の反復で発生したのでしょうか、それとも私の設定に何か問題があるのでしょうか? さらに重要なことに、ハッシュに重大な影響を与える可能性のある他の同様のエラーがある可能性はありますか?
ありがとう。