第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

從多個(gè)輸入字符串生成確定性唯一固定長(zhǎng)度文件名字符串

從多個(gè)輸入字符串生成確定性唯一固定長(zhǎng)度文件名字符串

牛魔王的故事 2021-11-03 16:21:35
我有多個(gè)字符串,我想用它們來(lái)生成一個(gè)單一的、固定長(zhǎng)度的、確定性的字符串。我試圖確保數(shù)據(jù)庫(kù)中的唯一性,并且還將使用字符串作為文件名;所以我需要盡可能避免沖突,并需要避免特殊字符。我還需要它是確定性的,以便相同順序的相同三個(gè)字符串將產(chǎn)生相同的輸出字符串。我想在已知的分隔符和 base64 編碼上連接字符串。然而,這不是固定長(zhǎng)度。我想連接字符串,從該字符串中獲取哈希值,然后對(duì)它進(jìn)行 base64 編碼。然而,默認(rèn)情況下 base64 有特殊字符,windoze 會(huì)抱怨,這似乎是不好的做法?,F(xiàn)在我正在這樣做,這也感覺很丑陋: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;    }}與此方法發(fā)生沖突的幾率是多少?從多個(gè)輸入字符串生成適合文件名的確定性固定長(zhǎng)度字符串的最佳方法是什么?當(dāng)然不是這樣。
查看完整描述

2 回答

?
猛跑小豬

TA貢獻(xiàn)1858條經(jīng)驗(yàn) 獲得超8個(gè)贊

我真的不明白,是什么阻礙了你像你已經(jīng)做的那樣只使用哈希函數(shù)?它們旨在完成您想要實(shí)現(xiàn)的目標(biāo)(前提是我說(shuō)對(duì)了)。您可以簡(jiǎn)單地連接字符串,應(yīng)用散列函數(shù)并存儲(chǔ)散列。

碰撞當(dāng)然是可能的,但是當(dāng)試圖將無(wú)限空間映射到有限空間時(shí),情況總是如此。


查看完整回答
反對(duì) 回復(fù) 2021-11-03
?
慕標(biāo)琳琳

TA貢獻(xiàn)1830條經(jīng)驗(yàn) 獲得超9個(gè)贊

我現(xiàn)在想出的解決方案是:


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;

    }

}

正如我讀過(guò)的那樣,UUID.nameUUIDFromBytes(hash);將計(jì)算給定散列的 md5,這會(huì)降低散列的分辨率。使用散列的原始十六進(jìn)制似乎是我能想到的最優(yōu)雅的方式,但我當(dāng)然愿意接受其他答案。


查看完整回答
反對(duì) 回復(fù) 2021-11-03
  • 2 回答
  • 0 關(guān)注
  • 274 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)