Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在.Net中的唯一字符串集合中创建一个唯一哈希?_C# - Fatal编程技术网

C# 如何在.Net中的唯一字符串集合中创建一个唯一哈希?

C# 如何在.Net中的唯一字符串集合中创建一个唯一哈希?,c#,C#,我正在寻找关于在.NETC中查找或创建哈希算法的建议 我有一个数据库中的列集合。 表中的列组合保证生成 唯一的字符串 考虑: 我将列连接成单个字符串: String ColumnKey = Column1 + Column2 + Column3; 目前,我正在使用string类中内置的.NETC哈希函数 int hashKey = ColumnKey.GetHashCode(); 经过阅读,我的理解是,虽然概率很低,但该算法不能保证唯一性。我的理解是,该函数可以在不同版本的.Net Fram

我正在寻找关于在.NETC中查找或创建哈希算法的建议

我有一个数据库中的列集合。 表中的列组合保证生成 唯一的字符串

考虑:

我将列连接成单个字符串:

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();