今天我和其他开发人员讨论了第三方库中的限制,我们不能在字符串中使用空格。原因是字符串在.NET Hashtable中用作键,而当键包含空格时,搜索.NET HashTable的速度明显变慢。
既然我懒得写一个测试,但我仍然想知道为什么会这样,我在这里问我的问题:
当使用的字符串包含空格时,搜索Hashtable会变慢吗?
我不希望这样,因为在执行搜索之前,使用String.GetHashCode()获取散列,然后使用该散列来定位表中的条目。
谢谢!
答案 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;
}
我可以弥补这一点:空间没有得到任何特殊处理。
结论:
答案 1 :(得分:3)
它不应该慢。它在内部使用GetHashCode(),因此字符串中的字符集无关紧要。
这就是说,性能仅取决于String的GetHashCode实现。 对于不同的框架版本(来自MSDN),您可能会得到不同的结果:
GetHashCode的行为是 取决于它的实施,哪个 可能会改变一个版本的 公共语言运行时到另一个。一个 这可能发生的原因是 提高性能 GetHashCode的。
答案 2 :(得分:1)
白色空格会增加字符串的长度,从而减慢散列函数的速度,但我希望这是非常微不足道的。另一方面,在字符串中留下空格会导致更好的散列,并且碰撞更少。所以我认为在HashTable中使用带空格的字符串没有任何问题。