更快的字符串GetHashCode(例如使用多核或GPU)

Bri*_*ian 9 .net c# optimization

根据http://www.codeguru.com/forum/showthread.php?t=463663,3.5中的C#getHashCode功能实现为:

public override unsafe int GetHashCode()
{
    fixed (char* str = ((char*) this))
    {
        char* chPtr = str;
        int num = 0x15051505;
        int num2 = num;
        int* numPtr = (int*) chPtr;
        for (int i = this.Length; i > 0; i -= 4)
        {
            num = (((num << 5) + num) + (num >> 0x1b)) ^ numPtr[0];
            if (i <= 2)
            {
                break;
            }
            num2 = (((num2 << 5) + num2) + (num2 >> 0x1b)) ^ numPtr[1];
            numPtr += 2;
        }
        return (num + (num2 * 0x5d588b65));
    }
}
Run Code Online (Sandbox Code Playgroud)

我很好奇是否有人可以提出一个返回相同结果的功能,但速度更快.可以增加主应用程序的总体启动和资源开销.要求一次性初始化(每个应用程序执行,而不是每个调用或每个字符串)都可以.

请注意,与微软不同的是,"以这种方式执行此操作会使其他所有内容变得更慢并且成本会使这种方法变得愚蠢!" 可以忽略,因此有可能即使假设微软是完美的,也可以通过做一些"愚蠢的事情"来打败它.

这纯粹是我自己好奇的练习,不会用在真实的代码中.

我想到的想法的例子:

  • 使用多个核心(独立计算num2和num)
  • 使用gpu

eld*_*rge 2

线程和 GPU 肯定会带来比可能的性能提升更大的开销。合理的方法是使用 SIMD 指令集,例如 SSE。然而,这需要测试该特定指令集是否可用,这可能会花费成本。它还只会为长弦带来提升。

如果您想尝试一下,请考虑在深入研究 C 或汇编之前测试Mono 对 SIMD 的支持。请阅读此处了解开发可能性和陷阱。