【发布时间】:2011-03-18 16:31:14
【问题描述】:
可能重复:
How do I create a HashCode in .net (c#) for a string that is safe to store in a database?
我计划在我的数据库中存储数十万个 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's here,但不确定如何修改以适用于字符串(使用 ascii 代码循环遍历每个字符?)。
有没有比使用哈希算法更好的字符串压缩算法?
谢谢
很多人的反应都很棒。非常感谢!!!
【问题讨论】:
-
我知道这并不能回答您的问题,但是对于长期使用 URL 作为密钥会非常谨慎。我的经验是,它们会因多种原因而改变。
-
他们可以,尽管 URI 本质上是分布式全局系统的关键。只要您使用它可以处理不断变化的事情,它在许多情况下都是一个好方法。遗憾的是,它在拥有自己的哈希索引的数据库中效果更好。
-
嘿@n8wrl,对于我的应用程序来说,它确实是我感兴趣的 URI 本身,不一定代表它的含义。我正在使用我的辅助 RegEx/hash 策略来缓解 URL 可能变化的问题。因此,例如,我可以匹配这两个字符串,因为域 abc 的 RegEx 仅使用参数 a:
http://www.abc.com?/a=5www.abc.com?a=b&pagecount=2
标签: c# sql-server regex hash gethashcode