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,這會降低散列的分辨率。使用散列的原始十六進制似乎是我能想到的最優雅的方式,但我當然愿意接受其他答案。
添加回答
舉報