C# 如何在.Net中的唯一字符串集合中创建一个唯一哈希?
我正在寻找关于在.NETC中查找或创建哈希算法的建议 我有一个数据库中的列集合。 表中的列组合保证生成 唯一的字符串 考虑: 我将列连接成单个字符串:C# 如何在.Net中的唯一字符串集合中创建一个唯一哈希?,c#,C#,我正在寻找关于在.NETC中查找或创建哈希算法的建议 我有一个数据库中的列集合。 表中的列组合保证生成 唯一的字符串 考虑: 我将列连接成单个字符串: String ColumnKey = Column1 + Column2 + Column3; 目前,我正在使用string类中内置的.NETC哈希函数 int hashKey = ColumnKey.GetHashCode(); 经过阅读,我的理解是,虽然概率很低,但该算法不能保证唯一性。我的理解是,该函数可以在不同版本的.Net Fram
String ColumnKey = Column1 + Column2 + Column3;
目前,我正在使用string类中内置的.NETC哈希函数
int hashKey = ColumnKey.GetHashCode();
经过阅读,我的理解是,虽然概率很低,但该算法不能保证唯一性。我的理解是,该函数可以在不同版本的.Net Framework中为同一字符串生成不同的结果
我正在寻找另一种哈希算法,它可以保证唯一性,并在不同版本的.Net中生成一致的结果
有人能帮我从正确的方向开始吗?这是不可能的。int有2^32个不同的值,一个只有几个字符长的字符串可能有更多的值。因此,任何哈希算法都不能保证每个字符串的值是唯一的 参见鸽子洞原理
如果您希望每个.Net版本都有一个有保证的哈希,请自己实现该哈希。给出了几个例子。我会把它放在字符串的扩展方法中。这是不可能的。int有2^32个不同的值,一个只有几个字符长的字符串可能有更多的值。因此,任何哈希算法都不能保证每个字符串的值是唯一的 参见鸽子洞原理
如果您希望每个.Net版本都有一个有保证的哈希,请自己实现该哈希。给出了几个例子。我会把它放在字符串的扩展方法中。没有保证唯一的散列。散列的大小为.NET 32位,因此只有40亿个可能的散列。如果有更多的字符串,则必须发生冲突
因此,您所要求的是不可能的。没有保证唯一的散列。散列的大小为.NET 32位,因此只有40亿个可能的散列。如果有更多的字符串,则必须发生冲突
所以你所要求的是不可能的。你不能。您只是不能将任何可能的字符串填充到32位整数中并保证唯一性。请使用标准SHA算法之一。但是如果您担心唯一性,32位对于散列来说太低了。没有散列可以保证唯一性,但例如SHA256使冲突发生的几率非常低,你甚至不应该去想它。如果你想仔细想想,这是一本不错的读物:字符串散列码发生冲突的概率甚至不低。当你只有几万条记录时,你有百分之几的机会发生冲突,这是假设字符串是均匀分布的,不管它的散列算法是如何设计的。你用散列做什么?如果这是密码之类的,请按照另一条评论的建议使用SHA。如果这是针对数据结构中的bucket,那么GetHashCode可能就足够了。您需要注意的一件事是降低哈希值,使其更有可能生成冲突。如果前几个数据成员趋于相同,我认为在您自己的类中可能会发生这种情况。在这种情况下,您可能希望覆盖GetHashCode,但对于字符串,我认为这不会是一个问题。为什么需要唯一的哈希?您不能。您只是不能将任何可能的字符串填充到32位整数中并保证唯一性。请使用标准SHA算法之一。但是如果您担心唯一性,32位对于散列来说太低了。没有散列可以保证唯一性,但例如SHA256使冲突发生的几率非常低,你甚至不应该去想它。如果你想仔细想想,这是一本不错的读物:字符串散列码发生冲突的概率甚至不低。当你只有几万条记录时,你有百分之几的机会发生冲突,这是假设字符串是均匀分布的,不管它的散列算法是如何设计的。你用散列做什么?如果这是密码之类的,请按照另一条评论的建议使用SHA。如果这是针对数据结构中的bucket,那么GetHashCode可能就足够了。您需要注意的一件事是降低哈希值,使其更有可能生成冲突。如果前几个数据成员趋于相同,我认为在您自己的类中可能会发生这种情况。在这种情况下,您可能希望覆盖GetHashCode,但是对于字符串,我认为这不会是一个问题。为什么您需要一个唯一的哈希?感谢所有的快速响应。没问题。很高兴为您提供帮助:-谢谢您的快速回复。没问题。很高兴能帮忙:-
int hashKey = ColumnKey.GetHashCode();