我有几个使用不同键(int和string)的类,想通过共同接口与它们一起工作。这很简单,只需要将int转换为string,但显然会导致性能问题。我看到的另一个选项是将它们包装成“对象”,这也不是完美的选择,或者从字符串中生成唯一的整数(以前的“字符串”和“整数”之间没有连接,因此它们在“字符串”域中必须是唯一的),问题是“如何实现?”
以string.GetHashCode()
为例,它可以从一个字符串中返回一个int
,且碰撞概率很低。
要小心使用string.GetHashCode()
方法。
.Net文档说明https://msdn.microsoft.com/zh-CN/library/system.string.gethashcode(v=vs.110).aspx
哈希码本身不能保证稳定性。在.NET Framework的不同版本和平台(如32位和64位)中,相同字符串的哈希码可能会有所不同。在某些情况下,它们甚至可以根据应用程序域的不同而有所不同。
GetHashCode
方法会在每次应用程序执行时生成一个不同的值。这很容易测试,只需编写一个控制台应用程序,如 Console.WriteLine("".GetHashCode().ToString());
并运行应用程序两次。输出将每次都不同。 - Ted正如 @tudor 所指出的,GetHashCode 是从字符串(和其他对象)生成哈希码的支持方式。不幸的是,除非你对字符串集合施加严格限制,否则没有办法使整数表示唯一字符串。
也就是说,如果你的字符串足够短(即 2 个 Unicode 或 4 个 ASCII 字符),那么就有明显的一对一映射,或者如果你的字符串集合是有限且预先已知的。
关于这个问题的一些阅读材料:底层问题称为pigeonhole principle,它保证了冲突。由于Birthday paradox,在相当小的集合中发生碰撞的可能性非常大。