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

14

我有几个使用不同键(int和string)的类,想通过共同接口与它们一起工作。这很简单,只需要将int转换为string,但显然会导致性能问题。我看到的另一个选项是将它们包装成“对象”,这也不是完美的选择,或者从字符串中生成唯一的整数(以前的“字符串”和“整数”之间没有连接,因此它们在“字符串”域中必须是唯一的),问题是“如何实现?”


为什么将int转换为字符串明显会导致性能问题?我认为它比string.GetHashCode()更快。 - Mostafa Vatanpour
3个回答

19

string.GetHashCode()为例,它可以从一个字符串中返回一个int,且碰撞概率很低。


2
“非常低”不够,我也不想创建冲突解决机制,这似乎会增加额外的开销。 - Yan
4
你想要的是不可能实现的。像你想要的这样的任何算法都存在冲突的风险,即使GUIDs(全局唯一标识符)实际上并不是唯一的。 - Security Hound
1
Ramhound,这取决于版本。 - Joey
GetHashCode 也会生成负数。 - taher chhabrawala
1
@Ted:这只适用于 .Net Core,该版本是在本帖发布之后才推出的。在 .Net Framework 中,您始终会得到相同的哈希码。 - Tudor
显示剩余6条评论

4

1
更糟糕的是,GetHashCode 方法会在每次应用程序执行时生成一个不同的值。这很容易测试,只需编写一个控制台应用程序,如 Console.WriteLine("".GetHashCode().ToString()); 并运行应用程序两次。输出将每次都不同。 - Ted

3

正如 @tudor 所指出的,GetHashCode 是从字符串(和其他对象)生成哈希码的支持方式。不幸的是,除非你对字符串集合施加严格限制,否则没有办法使整数表示唯一字符串。

也就是说,如果你的字符串足够短(即 2 个 Unicode 或 4 个 ASCII 字符),那么就有明显的一对一映射,或者如果你的字符串集合是有限且预先已知的。

关于这个问题的一些阅读材料:底层问题称为pigeonhole principle,它保证了冲突。由于Birthday paradox,在相当小的集合中发生碰撞的可能性非常大。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接