在.NET GetHashCode方法中,很多地方都使用.NET 方法.特别是在快速查找集合中的项目或确定相等性时.是否有关于如何GetHashCode为我的自定义类实现覆盖的标准算法/最佳实践,因此我不会降低性能?
我只是很好奇,因为我猜它会影响性能.它是否考虑完整的字符串?如果是,长字符串会很慢.如果它只考虑字符串的一部分,它将具有不良的性能(例如,如果它只考虑字符串的开头,如果HashSet主要包含具有相同的字符串,则它将具有不良性能.
好吧,所以这一切都始于我对哈希码的兴趣.在Jon Skeet的一篇文章中做了一些阅读后,我问了这个问题.这让我对指针算法非常感兴趣,这是我几乎没有经验的.所以,在阅读完这个页面后,我开始尝试,因为我从那里得到了一个基本的理解,我的其他很棒的同行在这里!
现在我正在做更多的实验,我相信我已经准确地复制了string下面实现中的哈希码循环(我保留了错误的权利):
Console.WriteLine("Iterating STRING (2) as INT ({0})", sizeof(int));
Console.WriteLine();
var val = "Hello World!";
unsafe
{
fixed (char* src = val)
{
var ptr = (int*)src;
var len = val.Length;
while (len > 2)
{
Console.WriteLine((char)*ptr);
Console.WriteLine((char)ptr[1]);
ptr += 2;
len -= sizeof(int);
}
if (len > 0)
{
Console.WriteLine((char)*ptr);
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,结果对我来说有点困惑; 的种类.结果如下:
Iterating STRING (2) as INT (4)
H
l
o
W
r
d
Run Code Online (Sandbox Code Playgroud)
我原来认为,值ptr[1]是第二个与第一个字母一起读取(或挤压在一起)的字母.但是,显然不是这样.那是因为 …