如何为两个单词创建唯一键?

How to create a unique key for two words?

我正在创建一个聊天应用程序。我想将对话保存在不同的 XML 文件中。我正在考虑为两个名称(发件人和收件人)生成一个唯一的密钥,并使用该密钥作为文件名保存 XML 文件。
有生成那种密钥的算法吗?
我想把两个词组合起来作为一个键。但我想知道最佳实践。
更新
我想再次为相同的两个用户获得相同的密钥。

据我所知,您可以使用 2 个组合字符串的 hashCode() 来创建唯一键。请记住,2 个不同的对话可以具有相同的发件人和收件人姓名。

你不能把这两个词直接连接起来作为键。假设名称为 12345678 的用户正在聊天,这将给出密钥 12345678。但是如果 12345678 在哪里聊天呢?那会给出相同的密钥!

所以通常要做的是在您想要合并的两件事之间添加一些不应该出现的东西。也许名称中不允许使用一些特殊字符。更好的办法是使用用户的 ID,因为它可能不会随时间改变,而且通常只包含数字。

因此,如果上面的示例是用户 ID,您可以添加一个分隔符,在它们之间添加一些字母(这对文件名很有效)。例如只是一个下划线 _。现在键将是 1234_567812345_678,因此可以区分它们。

由于您现在已经添加了两个用户始终应生成相同密钥的要求,因此您可以先对这两个值进行排序。所以 1234 发送到 5678 应该得到与 5678 发送到 1234 相同的结果.

这将为两个用户名创建 filename.xml。如果您切换用户名的顺序,结果将是相同的。用户名被转换成两个 sha256 十六进制字符串。这些字符串被连接起来,return 值是该连接的 sha256 十六进制字符串。在 sha256 中还没有发现冲突,所以你可以假设它会产生一个唯一的文件名。文件名将很长,64 个字符。

此解决方案适用于重叠的用户名,例如 ("123", "456") 和 ("1234", "56"),用户名中允许使用任何字符。

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import javax.xml.bind.DatatypeConverter;

public class TestWhosebugQuestion {

    public static void main(String[] args) {
        try {
            System.out.println(makeXmlFileName("Mary", "John"));
        } catch (NoSuchAlgorithmException |UnsupportedEncodingException ex) {
            // Your error handling here!
        }
    }

    private static String makeXmlFileName(String username1, String username2) 
            throws NoSuchAlgorithmException, UnsupportedEncodingException {
        MessageDigest md = MessageDigest.getInstance("SHA-256");
        md.reset();
        String key;
        if (username1.compareTo(username2) > 0) {
            key = DatatypeConverter.printHexBinary(md.digest(username2.getBytes("UTF-8")))
                + DatatypeConverter.printHexBinary(md.digest(username1.getBytes("UTF-8")));
        } else {
            key = DatatypeConverter.printHexBinary(md.digest(username1.getBytes("UTF-8")))
                + DatatypeConverter.printHexBinary(md.digest(username2.getBytes("UTF-8")));
        }
        return DatatypeConverter.printHexBinary(md.digest(key.getBytes("UTF-8"))) + ".xml";
    }
}