亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從多個輸入字符串生成確定性唯一固定長度文件名字符串

從多個輸入字符串生成確定性唯一固定長度文件名字符串

牛魔王的故事 2021-11-03 16:21:35
我有多個字符串,我想用它們來生成一個單一的、固定長度的、確定性的字符串。我試圖確保數據庫中的唯一性,并且還將使用字符串作為文件名;所以我需要盡可能避免沖突,并需要避免特殊字符。我還需要它是確定性的,以便相同順序的相同三個字符串將產生相同的輸出字符串。我想在已知的分隔符和 base64 編碼上連接字符串。然而,這不是固定長度。我想連接字符串,從該字符串中獲取哈希值,然后對它進行 base64 編碼。然而,默認情況下 base64 有特殊字符,windoze 會抱怨,這似乎是不好的做法?,F在我正在這樣做,這也感覺很丑陋:protected UUID parseUUID() {    try {        MessageDigest digest = MessageDigest.getInstance("SHA-256");        List<String> strings = new ArrayList<>();        strings.add(stringOne);        strings.add(stringTwo);        strings.add(stringThree);        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 UUID.nameUUIDFromBytes(hash);    } catch(NoSuchAlgorithmException e) {        return null;    }}與此方法發生沖突的幾率是多少?從多個輸入字符串生成適合文件名的確定性固定長度字符串的最佳方法是什么?當然不是這樣。
查看完整描述

2 回答

?
猛跑小豬

TA貢獻1858條經驗 獲得超8個贊

我真的不明白,是什么阻礙了你像你已經做的那樣只使用哈希函數?它們旨在完成您想要實現的目標(前提是我說對了)。您可以簡單地連接字符串,應用散列函數并存儲散列。

碰撞當然是可能的,但是當試圖將無限空間映射到有限空間時,情況總是如此。


查看完整回答
反對 回復 2021-11-03
?
慕標琳琳

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


查看完整回答
反對 回復 2021-11-03
  • 2 回答
  • 0 關注
  • 285 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號