我们如何决定hashCode()集合方法的最佳实现(假设equals方法已被正确覆盖)?
背景:
我们希望能够在查询中快速匹配这些字符串,而不会影响大量连接.
所以我想在主表中存储所有这些字符串的哈希码并将其包含在索引中,因此只有当哈希码匹配时才会由数据库处理连接.
那么我如何获得一个好的哈希码呢?我可以:
那人们怎么想?
最后,我只是连接字符串并计算连接的哈希码,因为它很简单并且工作得很好.
(如果你关心我们使用的是.NET和SqlServer)
Bug!,Bug!
引自 Eric Lippert的GetHashCode指南和规则
System.String.GetHashCode的文档特别指出,两个相同的字符串在CLR的不同版本中可以具有不同的哈希码,实际上它们也是如此.不要在数据库中存储字符串哈希并期望它们永远是相同的,因为它们不会.
所以不应该使用String.GetHashcode().
我使用C#4.0并通过调用获取字符串哈希:
"my string".GetHashCode()
Run Code Online (Sandbox Code Playgroud)
此调用生成的代码存储在数据库中以供将来使用.此哈希码用于查找字符串的某个子集,然后进行相等比较.
问题是:
我想为字符串生成一个整数哈希码,它将永远保持不变; 即相同的字符串应始终产生相同的哈希码.
散列不必是加密安全的,它不会用于密码或敏感数据.
我的第一次尝试是使用.net框架string.GetHashCode()函数.但是在阅读消息来源后,我发现了以下内容:
Run Code Online (Sandbox Code Playgroud)// We want to ensure we can change our hash function daily. // This is perfectly fine as long as you don't persist the // value from GetHashCode to disk or count on String A // hashing before string B. Those are bugs in your code. hash1 ^= ThisAssembly.DailyBuildNumber;
这似乎表明哈希码不会保持不变.
如果是这样,框架是否有另一种方法来生成可重复的哈希码?或者GetHashCode的代码是否是实现我自己的代码的合理起点?
我正在寻找尽可能轻巧和快速的东西.
我找到了System.Security.Cryptography.MD5,但对于一个简单的int32哈希码来说这似乎有点过头了,我担心开销.至少它需要从字符串转换为字节数组,从字节数组转换为int,并MD5()为每个散列创建新对象,或管理某些静态共享MD5对象().
我正在尝试提出一种算法,将字符串散列到特定数量的桶中,但还没有想到如何做到这一点?
我有一个这样的字符串列表:
a.jpg
b.htm
c.gif
d.jpg
e.swf
我想运行一个函数来根据字符串获取 1 到 4 之间的数字。
egajpg 将是 3
b.htm 将是 2
c.gif 将是 1
等等
它需要保持一致,因此如果我在 a.jpg 上运行该函数,它总是返回 3。
该算法用于在服务器之间分配资源......
egajpg 将从 server3.mydomain.com 访问b.htm 将从 server2.mydomain.com
等
访问
有谁知道我将如何去做这件事?
任何建议将不胜感激!
干杯
蒂姆
我计划在数据库中存储数十万个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代码遍历每个字符?)。
有没有比使用散列算法更好的字符串压缩算法?
谢谢
令人敬畏的回应有很多。非常感谢你!!!
我试图使用编程语言提供的默认哈希函数生成三个不同的字符串 A、B 和 C,以便它们的哈希值全部相等。具体来说,我需要确保A不等于B,B不等于C,A不等于C。
我尝试了多种方法,但尚未成功找到解决方案。我正在寻求帮助来实现可以满足这些要求的方法或算法。所有三个字符串的哈希值必须相同,这一点至关重要。
这是我的实现,但是它仍然不完整,因为我与前两个字符串发生了冲突,但与第三个字符串没有发生冲突。
var dictionary = new Dictionary<int, string>();
int collusionCounter = 0, stringCounter = 0;
string myString;
int hash = 0;
List<string> myList = new List<string>();
while (true)
{
stringCounter++;
myString = stringCounter.ToString();
try
{
hash = myString.GetHashCode();
dictionary.Add(hash, myString);
}
catch (Exception)
{
if (dictionary.ContainsKey(hash))
{
myList.Add(myString);
collusionCounter++;
if (collusionCounter == 2)
{
break;
}
}
continue;
}
}
var A = myList[0];
var B = myList[1];
var C = dictionary[hash];
Console.WriteLine($"{A.GetHashCode()} {B.GetHashCode()} {C.GetHashCode()}");
Run Code Online (Sandbox Code Playgroud)
hier …
c# ×5
hash ×5
hashcode ×4
.net ×2
gethashcode ×2
bucket ×1
equals ×1
java ×1
portability ×1
regex ×1
sql-server ×1
string ×1