Я предполагаю, что вы это делаете, потому что вам нужно сохранить значение в другом месте и сравнить с ним. Таким образом, ответ Заха (хотя и полностью правильный) может вызвать проблемы, поскольку контракт для String.GetHashCode() явно указывает на его возможности для изменения.
Таким образом, здесь фиксированная и легко повторяемая версия на других языках.
Я предполагаю, что во время компиляции вы будете знать количество десятичных цифр. Это основано на Jenkins One At Time Hash (как реализовано и exhaustively tested by Bret Mulvey), поэтому оно обладает отличным лавинным поведением (изменение одного бита на входе распространяется на все биты вывода), что означает несколько ленивая редукция по модулю в битах в конце концов, это не является серьезным недостатком для большинства применений (хотя вы могли бы сделать лучше с более сложным поведением)
const int MUST_BE_LESS_THAN = 100000000; // 8 decimal digits
public int GetStableHash(string s)
{
uint hash = 0;
// if you care this can be done much faster with unsafe
// using fixed char* reinterpreted as a byte*
foreach (byte b in System.Text.Encoding.Unicode.GetBytes(s))
{
hash += b;
hash += (hash << 10);
hash ^= (hash >> 6);
}
// final avalanche
hash += (hash << 3);
hash ^= (hash >> 11);
hash += (hash << 15);
// helpfully we only want positive integer < MUST_BE_LESS_THAN
// so simple truncate cast is ok if not perfect
return (int)(hash % MUST_BE_LESS_THAN)
}
В последней строке кода отсутствует код с запятой. Пытался отредактировать, но SO требует 6 изменений. –