如何在两个用户之间创建唯一的ID ?
本文关键字:创建 之间 唯一 ID 用户 两个 | 更新日期: 2023-09-27 18:02:33
所以我一直在研究一个c#加密信使,它有加密/解密序列,需要使用唯一的45个字符集。
我创建了一些作为演示,加密工作。但目前我正在添加登录系统。登录后,您将获得一个人员列表,您与之交谈的每个人都将具有唯一的会话ID。
所以基本上,我想找到一种方法来创建这个会话ID,这样它对于你添加的每个用途都是不同的,但如果另一个用户添加你,它是相同的。
例如:我添加Bob,对话ID为:R4ToGdKknnFKZNucj8xvpoP30vagfhtIdyrrLnQG
目前,如果Bob加了我,ID会不一样。但我正在努力找到一种方法,使两个用户之间的内容相同,但其他两个用户之间的内容不同。
如果有人能帮忙,那就太好了。我使用CodeProject提供的加密代码,但根据我的需要进行了编辑。如果需要,我可以在这里张贴代码。我使用的是c# Windows窗体应用程序
假设用户名是一致且唯一的,您可以将它们的一些字符串组合转换为更适合作为ID的格式(例如此过程创建的bigint):
string user1 = "daniel25";
string user2 = "kevin91";
var hashBuilder = new StringBuilder();
if (user1.CompareTo(user2) < 0)
{
hashBuilder.Append(user1);
hashBuilder.Append(user2);
}
else
{
hashBuilder.Append(user2);
hashBuilder.Append(user1);
}
var bytes = Encoding.Unicode.GetBytes(hashBuilder.ToString());
byte[] hashBytes;
using (var hasher = SHA1.Create())
{
hashBytes = hasher.ComputeHash(bytes);
}
long value = BitConverter.ToInt64(hashBytes, 12);
var uniqueHash = IPAddress.HostToNetworkOrder(value);
将该ID作为bigint存储在数据库中,这样就有了一个引用两个人之间对话的主键,并且也很容易索引和查找。
此方法有一些限制(例如用户"daniel25"answers"kevin91"接收与"daniel"answers"25kevin91"相同的哈希值),但我认为如果您添加不允许作为用户名字符的用户名"分隔符",则可以解决它们。
var hashBuilder = new StringBuilder();
hashBuilder.Append(user1);
hashBuilder.Append("@");
hashBuilder.Append(user2);
同样,如果你只想使用一个真正的哈希,你不需要转换成一个Int64
-你可以把hashBytes
直接转换成一个nvarchar字段。
通常,两个用户都不知道对方的会话ID。如果它可以很容易地生成,那么每个人都可以生成它,整个加密在设计上就已经不安全了。下面是在客户机/服务器通信中如何工作的一些示例:首先,RSA用于通信的非对称加密,以交换用于对称加密的AES密钥。密钥不是永久的,它应该随着每次新的对话而改变,即使是在相同的用户之间。
除了Chris Schubert的回答:当你添加string.CompareTo(string)
时,你将得到每对相同的哈希值。
当你比较这些值的时候,你会得到每一对重复的哈希值:
if (user1.CompareTo(user2) < 0)
{
hashBuilder.Append(user1);
hashBuilder.Append(user2);
}
else
{
hashBuilder.Append(user2);
hashBuilder.Append(user1);
}
这样kevin是user1还是daniel就不重要了