java - 从多个输入字符串生成确定性唯一固定长度文件名字符串

标签 java string hash filenames deterministic

我有多个字符串,我想用它们生成一个固定长度的确定性字符串。我试图确保数据库中的唯一性,并且还将使用字符串作为文件名;所以我需要尽可能避免碰撞,并且需要避免特殊字符。我还需要它是确定性的,以便相同顺序的相同三个字符串将产生相同的输出字符串。

我考虑将字符串连接到已知的分隔符和 Base64 编码上。然而,这不是固定长度。

我想到连接字符串,从该字符串中获取哈希值,然后对其进行 Base64 编码。然而,默认情况下,base64 有特殊字符,windoze 会提示,这似乎是不好的做法。

现在我正在这样做,这也感觉很丑陋:

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;
    }
}

与此方法发生冲突的几率有多大?从多个输入字符串生成适合文件名的确定性固定长度字符串的最佳方法是什么?当然不是这样。

最佳答案

我真的不明白,是什么阻碍你像现在一样使用哈希函数?它们旨在完全实现您想要实现的目标(前提是我的理解是正确的)。您可以简单地连接字符串,应用哈希函数并存储哈希值。

当然,碰撞是可能的,但当尝试将无限空间映射到有限空间时,情况总是如此。

关于java - 从多个输入字符串生成确定性唯一固定长度文件名字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52693140/

相关文章:

java - Jenkins - groovy 脚本 - 以 dd-mm-yyyy 格式获取上次成功构建日期

c++ - 当返回指向本地数组的指针时,为什么它总是相同的值?

Swift 5.0 "Set"允许重复值

git - 为什么 Git 不被视为 "block chain"?

java - CoinCounter实验室

java - 如何在Microstream中正确使用BinaryHandler来存储 volatile 长整型数组?

c++ - 此 UTF-8 实现是实现定义的还是定义明确的?

c++ - 如何在 C++ 中对字符串进行哈希处理?

javascript - 根据字符串获取永久数组项

java - 如何禁止 Java VM 在崩溃/将敏感数据写入磁盘时创建任何转储