Прежде всего, рассмотрите возможность использования GetHashCode()
.
Простое улучшение существующей реализации:
static UInt64 CalculateHash(string read, bool lowTolerance)
{
UInt64 hashedValue = 0;
int i = 0;
ulong multiplier = 1;
while (i < read.Length)
{
hashedValue += read[i] * multiplier;
multiplier *= 37;
if (lowTolerance) i += 2;
else i++;
}
return hashedValue;
}
Это позволяет избежать дорогостоящих вычислений с плавающей запятой и накладных расходов ElementAt
.
Кстати (UInt64)Math.Pow(31, i)
не подходит для длинных струн. Округление с плавающей точкой приведет к умножению 0 для символов старше 15 или около того.