如果不尝试所有组合和比较,这是不可能的。问题是 getString 不会返回给定哈希值唯一的数字作为字节。
getString
例如,如果字节被估值 0216 然后十六进制 02 变 "2" 用十进制字符串编码和 16 变 "22" 。所以你的方法会回来 "222" 作为两者的串联。现在,如果我们做同样的事情 1602 然后它会导致 "22" 和 "2" ,连接仍然会导致 "222" 。这可能发生在字节数组中的每个字节组合中。
0216
02
"2"
16
"22"
"222"
1602
因此,虽然结果可能仍然是相对安全的哈希,但发现冲突的可能性是 许多 更高。你可以做的是返回一大堆哈希值,其中1将导致匹配,但这需要大量的计算;如果你想比较你最好把你的结果通过 getString 并比较安全性较低的哈希值(甚至比MD5更安全)。
我试着编写一些找到所有可能组合的代码,结果发现它比我预期的要少得多。在这种情况下只有2。找到它们只需要很少的时间。
import java.util.ArrayList; import java.util.Arrays; public class Comb { static long combinations(String str, int startIdx, int numBytes, ArrayList<byte[]> combinations, byte[] combination) { if(startIdx >= str.length()) { if(numBytes == 16) { combinations.add(combination.clone()); return 1; } else return 0; } if(numBytes > 15) return 0; combination[numBytes] = (byte)(str.charAt(startIdx) - '0'); long result = combinations(str, startIdx + 1, numBytes + 1, combinations, combination); if(startIdx < str.length() - 1 && str.charAt(startIdx) != '0') { combination[numBytes] = (byte)((str.charAt(startIdx) - '0') * 10 + (str.charAt(startIdx + 1) - '0')); result += combinations(str, startIdx + 2, numBytes + 1, combinations, combination); } if(startIdx < str.length() - 2) { combination[numBytes] = (byte)((str.charAt(startIdx) - '0') * 100 + (str.charAt(startIdx + 1) - '0') * 10 + (str.charAt(startIdx + 2) - '0')); if(str.charAt(startIdx) == '1') result += combinations(str, startIdx + 3, numBytes + 1, combinations, combination); if(str.charAt(startIdx) == '2' && (str.charAt(startIdx + 1) < '5' || str.charAt(startIdx + 1) == '5' && str.charAt(startIdx + 2) < '6')) { result += combinations(str, startIdx + 3, numBytes + 1, combinations, combination); } } return result; } public static void main(String[] args) { ArrayList<byte[]> combinations = new ArrayList<>(); System.out.println(combinations("1518918615824625494170109603025017352201241", 0, 0, combinations, new byte[16])); for(byte[] c: combinations) { System.out.println(Arrays.toString(c)); } } }
这个输出是:
2 [15, -67, -70, -98, -10, -2, 94, -86, 109, 60, 30, -6, -83, 52, -55, -15] [-105, 89, -70, -98, -10, -2, 94, -86, 109, 60, 30, -6, -83, 52, -55, -15]
它找到的第二个解决方案确实是正确的。