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

时间:2016-05-29 14:50:58

标签: java algorithm chat

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

3 个答案:

答案 0 :(得分:5)

你不能只将这两个词连接起来作为关键。让我们假设名为 1234 5678 的用户正在聊天,这将提供密钥 12345678 。但是,如果 12345 678 在哪里聊天呢?这会给出相同的密钥!

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

因此,如果上面的例子是userIds,你可以添加一个在它们之间有一些字母的分隔符(适用于文件名)。例如,只是一个下划线 _ 。现在键是 1234_5678 12345_678 ,因此可以区分它们。

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

答案 1 :(得分:0)

这将为两个用户名创建一个filename.xml。如果切换用户名的顺序,结果将是相同的。用户名变为两个sha256十六进制字符串。这些字符串是连接的,返回值是该连接的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 TestStackOverflowQuestion {

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

答案 2 :(得分:-1)

据我所知,您可以使用2个组合字符串中的['aaaa'] in leafgen(nested_dict) 来创建唯一键。请记住,2个不同的会话可以具有相同的发件人和收件人名称。