mrb*_*398 12 c# hash gethashcode
我正在尝试编写一个方法来根据任何给定的字符串生成一个整数.在2个相同的字符串上调用此方法时,我需要该方法两次生成相同的完整整数.
我尝试使用.GetHasCode()但是当我将项目移动到另一台机器时,这是非常不可靠的,因为GetHasCode()为同一个字符串返回不同的值
碰撞率非常低也很重要.到目前为止我编写的自定义方法仅在几十万个记录之后产生冲突.
哈希值必须是整数.字符串哈希值(如md5)会在速度和负载开销方面削弱我的项目.
整数哈希用于执行非常快速的文本搜索,我工作得很漂亮,但是它当前依赖于.GetHasCode()并且在涉及多台机器时不起作用.
任何见解都将非常感激.
Rud*_*ism 17
MD5哈希返回一个字节数组,可以转换为整数:
var mystring = "abcd";
MD5 md5Hasher = MD5.Create();
var hashed = md5Hasher.ComputeHash(Encoding.UTF8.GetBytes(mystring));
var ivalue = BitConverter.ToInt32(hashed, 0);
Run Code Online (Sandbox Code Playgroud)
当然,您正在从128位散列转换为32位整数,因此一些信息正在丢失,这将增加冲突的可能性.您可以尝试调整第二个参数,ToInt32以查看MD5哈希的任何特定范围是否产生的冲突少于数据的其他范围.
如果您的哈希代码在"几十万条记录之后"创建了重复项,那么您就拥有了非常好的哈希代码实现.
如果你进行数学计算,你会发现32位哈希码有大约50%的机会在大约70,000条记录后创建一个副本.在一百万条记录之后产生副本的可能性非常接近于确定无关紧要.
根据经验,当散列的记录数等于可能值数的平方根时,生成重复散列码的可能性为50%.因此,对于具有2 ^ 32个可能值的32位哈希码,在大约2 ^ 16(65,536)个值之后生成重复的机会是50%.在实际的数字是稍大-接近70,000 -但经验法则让你在球场.
另一个经验法则是,当散列的项目数是平方根的四倍时,生成重复的几率几乎为100%.因此,使用32位哈希码,您几乎可以保证在仅有2 ^ 18(262,144)个记录散列后发生冲突.
如果使用MD5并将其从128位转换为32位,则不会改变.