.NET C#中相同值的哈希码是否始终一致 可跨进程比对吗?
问题答案
不能用该方式跨进程比对哈希值,相同Name、Type属性的对象在两个进程中计算得到的哈希码大概率不一致,原因如下:
string.GetHashCode()的实现本身就不具备跨进程、跨版本、跨平台的一致性,.NET官方明确规定该方法的返回值仅在当前应用程序域内有效,甚至同一个进程重启后,相同字符串计算出的哈希码都可能发生变化,完全不适合存入数据库做持久化比对使用。- 你使用的
ToLower()方法依赖当前运行环境的区域文化设置,就算是同一台设备的两个进程,如果区域文化配置不同,相同字符串转小写的结果都可能不一致,进一步放大了哈希值差异的概率。 - 直接对两个哈希码做加法的计算方式本身哈希碰撞概率极高,哪怕不考虑跨进程的问题,也不适合作为唯一标识存入数据库使用。
替代方案
如果需要生成可持久化、跨进程稳定的哈希值,建议使用确定性的标准哈希算法:
- 优先用
ToLowerInvariant()而非ToLower()处理字符串,规避区域文化带来的大小写转换差异 - 拼接两个处理后的字符串,指定统一编码(比如UTF-8)转成字节数组
- 用MD5、SHA256等标准密码学哈希算法计算字节数组的哈希值,再转成十六进制字符串存入数据库即可。
内容的提问来源于stack exchange,提问作者Chandu
相关产品推荐
相关产品推荐

