Страницы

Поиск по вопросам

четверг, 25 октября 2018 г.

C# Хеш от строки, нужен алгоритм

В C# у типа string есть метод GetHashCode() возвращающий хеш значение типа int. Этот метод на разных версия платформы .Net Framework возвращает разное значение. Для моей задачи требуется, чтобы возвращаемое значение было одинаковое на разных платформах. Нужен алгоритм вычисления хеша строки возвращающий int. Может кто-нибудь предложить такой алгоритм?
Уточнения:
Без использования unsafe кода. Весь диапазон int (положительные и отрицательные числа) Входная строка небольшая.


Ответ

Можно взять любую реализацию String.GetHashCode и использовать ее, вот переписанные без unsafe 2 версии. Можете убедиться, что StringHashCode40 возвращает тоже самое, что и нативный GetHashCode
public static int StringHashCode20(string value) { int num = 352654597; int num2 = num;
for (int i = 0; i < value.Length; i += 4) { int ptr0 = value[i] << 16; if (i + 1 < value.Length) ptr0 |= value[i + 1];
num = (num << 5) + num + (num >> 27) ^ ptr0;
if (i + 2 < value.Length) { int ptr1 = value[i + 2] << 16; if (i + 3 < value.Length) ptr1 |= value[i + 3]; num2 = (num2 << 5) + num2 + (num2 >> 27) ^ ptr1; } }
return num + num2 * 1566083941; }
public static int StringHashCode40(string value) { int num = 5381; int num2 = num; for (int i = 0; i < value.Length; i += 2) { num = (((num << 5) + num) ^ value[i]);
if (i + 1 < value.Length) num2 = (((num2 << 5) + num2) ^ value[i + 1]); } return num + num2 * 1566083941; }
static void Main(string[] args) { string value = "123"; Console.WriteLine(StringHashCode20(value)); Console.WriteLine(StringHashCode40(value)); Console.WriteLine(value.GetHashCode()); }

Комментариев нет:

Отправить комментарий