【发布时间】:2012-03-21 16:24:25
【问题描述】:
我想对一个长度最大为 30 的字符串进行哈希处理。如果我关心的是时间,那么最好的办法是什么。该函数将被调用超过 1 亿次。目前我正在使用以下代码,
static UInt64 CalculateHash(string read, bool lowTolerance)
{
UInt64 hashedValue = 0;
int i = 0;
while (i < read.Length)
{
hashedValue += read.ElementAt(i) * (UInt64)Math.Pow(31, i);
if (lowTolerance) i += 2;
else i++;
}
return hashedValue;
}
【问题讨论】:
-
Object.GetHashCode()方法对您不起作用是否有原因?您似乎在重新实现相同的概念。 -
任何不使用浮点数学的东西都会更快。
-
GetHashCode 是不可持久的,所以如果他需要将 Hash Code 存储到数据库中,它是没有用的。再说一次,这也不是。你的用途是什么?您只需要在运行时对字符串进行哈希处理,或者您需要对哈希做什么?如果您需要存储 Adler-32 并且不会遇到太多冲突,则可能是一种选择。
-
@Pbasak 然后将其转换为
uint或使用0x7FFFFF屏蔽它。 -
运行分析器。这会告诉你慢的部分是什么。然后修复缓慢的部分。
标签: c# string performance hash