基于任何给定字符串生成整数(不带GetHashCode)



我正试图编写一个方法,根据任何给定的字符串生成一个整数。当在两个相同的字符串上调用此方法时,我需要该方法两次都生成相同的整数。

我尝试过使用.GetHasCode(),但一旦我将项目移到另一台机器上,这就非常不可靠了,因为GetHasCode(()为同一字符串返回不同的值

同样重要的是,碰撞率要非常低。到目前为止,我编写的自定义方法只在几十万条记录后就会产生冲突。

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

整数哈希被用来执行非常快速的文本搜索,我已经很好地完成了,但它目前依赖于.GetHasCode(),当多台机器参与时不起作用。

任何见解都将不胜感激。

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

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

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

如果您的哈希代码在"几十万条记录之后"创建了重复项,那么您就有了一个非常好的哈希代码实现。

如果你计算一下,你会发现一个32位的哈希代码在大约70000条记录后有50%的机会创建重复。在一百万条记录之后生成重复记录的概率是如此接近确定,以至于无关紧要。

根据经验,当散列的记录数等于可能值数的平方根时,生成重复散列码的可能性为50%。因此,对于具有2^32个可能值的32位哈希代码,在大约2^16(65536)个值之后生成重复的几率为50%。实际数字略大,接近70000,但经验法则会让你处于大致水平。

另一条经验法则是,当哈希项目的数量是平方根的四倍时,生成重复项的几率接近100%。因此,使用32位哈希代码,您几乎可以保证只对2^18(262144)条记录进行哈希处理后就会发生冲突。

如果您使用MD5并将其从128位转换为32位,这种情况不会改变。

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

int x= "ali".ToCharArray().Sum(x => x)%100;
using (MD5 md5 = MD5.Create())
{
    bigInteger = new BigInteger(md5.ComputeHash(Encoding.Default.GetBytes(myString)));
}

BigInteger需要Org.BouncyCastle.Math

最新更新