我制作了一个使用 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 位数字的哈希值本身有大约千万分之一的机会。这真的只发生在第五次迭代中,还是我的设置有问题?更重要的是,是否还有其他类似的错误会对我的哈希产生严重影响?
谢谢。