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