根据任何给定的字符串生成整数(不含GetHashCode)

时间:2014-11-11 17:00:16

标签: c# hash gethashcode

我尝试编写一个基于任何给定字符串生成整数的方法。当在2个相同的字符串上调用此方法时,我需要该方法两次生成相同的完整整数。

我尝试使用.GetHasCode()但是当我将项目移动到另一台机器时,这是非常不可靠的,因为GetHasCode()为同一个字符串返回不同的值

碰撞率非常低也很重要。到目前为止我编写的自定义方法只会在几十万个记录之后产生冲突。

哈希值必须是整数。字符串哈希值(如md5)会在速度和负载开销方面削弱我的项目。

整数哈希用于执行非常快速的文本搜索,我工作得很漂亮,但它目前依赖于.GetHasCode()并且在多台机器参与时不起作用。

任何见解都将非常感激。

4 个答案:

答案 0 :(得分:14)

MD5哈希返回一个可以转换为整数的字节数组:

var mystring = "abcd";
MD5 md5Hasher = MD5.Create();
var hashed = md5Hasher.ComputeHash(Encoding.UTF8.GetBytes(mystring));
var ivalue = BitConverter.ToInt32(hashed, 0);

当然,您正在从128位散列转换为32位整数,因此一些信息正在丢失,这将增加冲突的可能性。您可以尝试将第二个参数调整为ToInt32,以查看MD5哈希的任何特定范围是否产生的冲突少于数据的其他范围。

答案 1 :(得分:8)

如果您的哈希代码在几十万条记录之后创建了重复项""你有一个很好的哈希代码实现。

如果您do the math,您会发现32位哈希码在大约70,000条记录后有50%的机会创建副本。在一百万条记录之后产生重复的可能性非常接近于确定无关紧要。

根据经验,当散列的记录数等于可能值数的平方根时,生成重复散列码的可能性为50%。因此,对于具有2 ^ 32个可能值的32位哈希码,在大约2 ^ 16(65,536)个值之后生成重复的机会是50%。 实际数字略大 - 接近70,000 - 但经验法则会让你进入大球场。

另一个经验法则是,当散列的项目数是平方根的四倍时,生成重复的几率几乎为100%。因此,使用32位哈希码,您几乎可以确保在仅有2 ^ 18(262,144)条记录散列后发生冲突。

如果使用MD5并将其从128位转换为32位,则不会改变。

答案 2 :(得分:-1)

此代码将任何字符串映射到0到100之间的int

int x= "ali".ToCharArray().Sum(x => x)%100;

答案 3 :(得分:-1)

using (MD5 md5 = MD5.Create())
{
    bigInteger = new BigInteger(md5.ComputeHash(Encoding.Default.GetBytes(myString)));
}

BigInteger需要Org.BouncyCastle.Math