我计划在我的数据库中存储数十万个 URL。我的 UrlInfo 表中的每一行都是不可变的,而 URL 本身就是逻辑主键。由于 URL 可能相当长,因此我决定对 URL 进行哈希处理,以便在添加新行时快速找到可能的匹配项。哈希不是我真正的关键,只是一种快速找到可能匹配项的方法。此外,我使用每个域的 RegEx 模式,将 URL 的本质提炼成可以与其他 URL 进行比较的东西。我将 RegEx 的结果也存储为哈希,我不担心它是否会产生可能的重复项。
一切都很顺利,直到我了解到 C# 的 string.GetHashCode() 方法(我一直用来散列事物)不能保证在 .Net 的实现中是唯一的。当我尝试将哈希函数从 ASP.Net 移动到 SQLServer CLR 代码时,我注意到了这一点。Web 应用程序使用 .Net 4.0,我了解到,SQLServer 2008 R2 使用 .Net 3.5。他们为相同的字符串产生了单独的哈希结果,所以现在我需要摆脱使用 string.GetHashCode() ,因为当我将应用程序升级到未来版本的 .Net 时,我不想担心这种变化。
所以,问题:
自从我在我的数据库中存储哈希后,我的架构是否有异味?还有更好的方法吗?显然微软不希望我存储哈希结果!
有人可以推荐一个好的 C# 替换算法来散列字符串吗?我在这里看到了 Jon,但不确定如何修改以适用于字符串(使用 ascii 代码循环遍历每个字符?)。
有没有比使用哈希算法更好的字符串压缩算法?
谢谢
许多人的反应很棒。非常感谢你!!!