当键是字符串并且字符串包含空格时,搜索HashTable会变慢

时间:2009-11-17 11:07:18

标签: .net string hashtable

今天我和其他开发人员讨论了第三方库中的限制,我们不能在字符串中使用空格。原因是字符串在.NET Hashtable中用作键,而当键包含空格时,搜索.NET HashTable的速度明显变慢。

既然我懒得写一个测试,但我仍然想知道为什么会这样,我在这里问我的问题:

当使用的字符串包含空格时,搜索Hashtable会变慢吗?

我不希望这样,因为在执行搜索之前,使用String.GetHashCode()获取散列,然后使用该散列来定位表中的条目。

谢谢!

3 个答案:

答案 0 :(得分:5)

直接来自the Rotor source,String.GetHashcode方法的核心:

                int     c;
                char *s = src;
                while ((c = s[0]) != 0) {
                    hash1 = ((hash1 << 5) + hash1) ^ c;
                    c = s[1];
                    if (c == 0)
                        break;
                    hash2 = ((hash2 << 5) + hash2) ^ c;
                    s += 2;
                }

我可以弥补这一点:空间没有得到任何特殊处理。

结论:

  • 第三方不使用HashTable或将字符串包装成字符串以使空格更慢。
  • 或者他们试图通过讲故事来混淆他们的实施。

答案 1 :(得分:3)

它不应该慢。它在内部使用GetHashCode(),因此字符串中的字符集无关紧要。

这就是说,性能仅取决于String的GetHashCode实现。 对于不同的框架版本(来自MSDN),您可能会得到不同的结果:

  

GetHashCode的行为是   取决于它的实施,哪个   可能会改变一个版本的   公共语言运行时到另一个。一个   这可能发生的原因是   提高性能   GetHashCode的。

答案 2 :(得分:1)

白色空格会增加字符串的长度,从而减慢散列函数的速度,但我希望这是非常微不足道的。另一方面,在字符串中留下空格会导致更好的散列,并且碰撞更少。所以我认为在HashTable中使用带空格的字符串没有任何问题。