如何在 2 个用户之间创建唯一 ID?

How can I create a unique ID between 2 users?

所以我一直在开发一个 C# 加密信使,它有 encryption/decryption 需要使用唯一的 45 个字符集的序列。

我创建了一些作为演示,并且加密有效。但目前我正在添加一个登录系统。登录后,您会得到一个人员列表,与您交谈的每个人都会有一个唯一的对话 ID。

所以基本上,我想找到一种方法来创建此对话 ID,以便您添加的每次使用都不同,但如果其他用户添加您则相同。

例如: 我添加了 Bob,对话的 ID 是:R4ToGdKknnFKZNucj8xvpoP30vagfhtIdyrrLnQG

目前如果Bob加我,ID会不一样。但是我正在尝试找到一种方法使它在 2 个用户之间相同,但在其他 2 个用户之间不同。

如果有人能提供帮助,那就太好了。我正在使用 CodeProject 提供的加密代码,但根据我的需要进行了编辑。如果需要,我可以 post 这里的代码。我正在使用 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" 和 "kevin91" 收到与 "daniel" 和“25kevin91”相同的散列),但我认为您可以解决这些问题,如果您添加了不允许作为用户名字符的用户名 'separator'。

var hashBuilder = new StringBuilder();
hashBuilder.Append(user1);
hashBuilder.Append("@");
hashBuilder.Append(user2);

此外,如果您只想使用真正的散列,则无需转换为 Int64 - 您可以将 hashBytes 直接带入 nvarchar 字段。

通常,两个用户都不知道对方的对话 ID。如果它可以很容易地生成,那么每个人都可以生成它,整个加密在设计上就已经不安全了。下面是一些 example 它在 client/server 通信中的工作原理:首先,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 就无所谓了