2 回答
TA贡献1858条经验 获得超8个赞
我真的不明白,是什么阻碍了你像你已经做的那样只使用哈希函数?它们旨在完成您想要实现的目标(前提是我说对了)。您可以简单地连接字符串,应用散列函数并存储散列。
碰撞当然是可能的,但是当试图将无限空间映射到有限空间时,情况总是如此。
TA贡献1830条经验 获得超9个赞
我现在想出的解决方案是:
protected String parseHash() {
try {
MessageDigest digest = MessageDigest.getInstance("SHA-512");
List<String> strings = new ArrayList<>();
strings.add("one");
strings.add("two");
strings.add("three");
strings.removeIf(str -> str == null || str.isEmpty());
for(int i = 0; i < strings.size(); i++) {
String string = strings.get(i);
string = string.replace("|", "\\|");
strings.set(i, string);
}
String input = String.join("|", strings);
byte[] hash = digest.digest(input.getBytes());
return DatatypeConverter.printHexBinary(hash);
} catch(NoSuchAlgorithmException e) {
return null;
}
}
正如我读过的那样,UUID.nameUUIDFromBytes(hash);将计算给定散列的 md5,这会降低散列的分辨率。使用散列的原始十六进制似乎是我能想到的最优雅的方式,但我当然愿意接受其他答案。
添加回答
举报