我有一些带有异构密钥的类 - int和string - 我希望通过通用接口使用它们。将int转换为字符串非常简单,但显然会导致性能问题。我看到的另一个选项是将它们设置为“对象”,这看起来似乎并不完美,或者以某种方式从字符串生成唯一的整数(前“string”和“int”之间不会有连接,因此它们必须仅在“字符串“域”,这里的quetsion是“how”?
答案 0 :(得分:13)
只需从string.GetHashCode()
获取int
,但碰撞概率非常低。
答案 1 :(得分:2)
请注意string.GetHashCode()
。
.Net文档指出https://msdn.microsoft.com/en-us/library/system.string.gethashcode(v=vs.110).aspx
哈希码本身并不保证稳定。哈希代码 相同的字符串状态可以在.NET版本之间有所不同 框架和跨平台(如32位和64位)的一个 单个版本的.NET Framework。在某些情况下,他们甚至可以 因应用领域而异
答案 2 :(得分:1)
正如@tudor所指出的,GetHashCode是从字符串(和其他对象)生成哈希码的受支持方式。遗憾的是,除非您对字符串集严格限制,否则无法进行此类转换,因此整数表示唯一字符串。
即。如果您的字符串足够短(即2个Unicode或4个ASCII字符),而不是明显的一对一映射,或者您的字符串集是有限的并且事先已知。
关于这个问题的一些解读:称为pigeonhole principle的潜在问题保证了碰撞。由于Birthday paradox碰撞很可能发生在相当小的集合上。