使用 UUID 为特定字符串生成唯一标识符是否安全(就唯一性而言)?

Is it safe (in matter of uniqueness) to use UUID to generate a unique identifier for specific string?

String myText;
UUID.nameUUIDFromBytes((myText).getBytes()).toString();

我正在使用上面的代码生成特定文本的代表。 例如 'Moien' 应该 总是 用 "e9cad067-56f3-3ea9-98d2-26e25778c48f" 表示,而不是项目重建之类的任何更改都应该能够更改该 UUID。

我这样做的原因是我不希望那些特定的文本对人类来说是可读的(可理解的)。

注意:我不需要散列后重新生成正文的能力(例如 "Moien")。

我也有另一种方法:

            MessageDigest digest = MessageDigest.getInstance("SHA-256");
            byte[] hash = digest.digest((matcher.group(1)).getBytes("UTF-8"));
            String a = Base64.encode(hash);

您认为哪种方式更适合我的问题?

UUID.nameUUIDFromBytes 似乎基本上只是 MD5 哈希,结果表示为 UUID。

我觉得明确使用 base64 编码的散列更清楚,部分原因是您可以控制使用哪个散列 - 如果冲突造成任何类型的安全风险,这可能是相关的。 (正是出于这个原因,SHA-256 可能是比 MD5 更好的选择。)当然,SHA-256 的字符串会更长,但希望这不是问题。

请注意,在 任一 情况下,我都会通过 StandardCharsets 使用固定编码将字符串转换为文本。不要使用平台默认值(根据您的第一个代码段)并且更喜欢 StandardCharsets 而不是魔术字符串值(根据您的第二个代码段)。