C# 如何从字符串生成唯一的整数?

C# 如何从字符串生成唯一的整数?,c#,.net,C#,.net,我有几个具有异构键的类-int和string-我希望通过公共接口使用它们。将int转换为string非常简单,但显然会导致性能问题。我看到的另一个选项是将它们框到“object”,这似乎也不完美,或者以某种方式从string生成唯一的整数(前面的“string”和“int”之间没有连接,因此它们必须仅在“string”域中是唯一的),这里的问题是“how”?只需使用string.GetHashCode()以极低的冲突概率从字符串返回int。正如@tudor指出的那样,GetHashCode是从字

我有几个具有异构键的类-int和string-我希望通过公共接口使用它们。将int转换为string非常简单,但显然会导致性能问题。我看到的另一个选项是将它们框到“object”,这似乎也不完美,或者以某种方式从string生成唯一的整数(前面的“string”和“int”之间没有连接,因此它们必须仅在“string”域中是唯一的),这里的问题是“how”?

只需使用
string.GetHashCode()
以极低的冲突概率从
字符串返回
int

正如@tudor指出的那样,GetHashCode是从字符串(和其他对象)生成哈希代码的受支持方式。不幸的是,并没有办法进行这样的转换,所以整数代表唯一的字符串,除非对字符串集进行严格限制

也就是说,如果您的字符串足够短(即2个Unicode或4个ASCII字符),则存在明显的一对一映射,或者如果您的字符串集有限且事先已知


关于这个主题的一些阅读:一个被称为保证碰撞的潜在问题。因为冲突很可能发生在相当小的集合上。

请注意
string.GetHashCode()


Net文档说明

哈希代码本身不能保证是稳定的。的哈希代码 相同的字符串状态在.NET的不同版本中可能有所不同 框架和跨平台(如32位和64位)的 .NET Framework的单一版本。在某些情况下,他们甚至可以 不同的应用领域


“非常低”是不够的,我不想创建冲突解决机制,这似乎是开销here@user1437713-你想要的是不可能的。任何像您想要的那样的算法都有冲突的风险,即使GUI实际上不是唯一的。Ramhound,取决于版本。它可能有数百万,而且“string key”对象和“integer key”之间的比例为1:10,这就是为什么我不想将int转换为string@Ted:这仅适用于.Net Core,这是在这篇文章写出来之后出现的。在.Net Framework中,您总是得到相同的哈希代码。为什么将int转换为string显然会导致性能问题?我认为它比string.GetHashCode()更快。几乎更糟糕的是:
GetHashCode
将为应用程序的每次执行生成不同的值。它很容易测试,只需编写一个控制台应用程序,比如console.WriteLine(“.GetHashCode().ToString()”);并运行应用程序两次。每次输出都会不同。