.NET: 64-битный хэш-код - PullRequest
       47

.NET: 64-битный хэш-код

2 голосов
/ 09 ноября 2011

Мне нужен 64-битный хеш для строк, и по умолчанию .GetHashCode () возвращает только 32-битный int. Я мог бы сгенерировать хеш MD5 / SHA1 и использовать только первые 64 бита. Но поскольку эти алгоритмы криптографически безопасны, они гораздо более требовательны к процессору.

Неужели это так просто, что просто вызвать .GetHashCode () второй раз, на обратной стороне входной строки? И приведение двух 32-битных int в 64-битную длину? Будет ли он иметь такое же сопротивление спреду и столкновениям, как и «настоящий» 64-битный хеш, такой как CRC64?

Ответы [ 3 ]

3 голосов
/ 09 ноября 2011

Вы собираетесь совершить очень большую ошибку.64-битный хэш не достаточно хорош, чтобы гарантировать уникальность .Это требует как минимум 128 бит.Guid - это обычный выбор.

Создание уникальных 32-битных или 64-битных чисел не так уж сложно, вы просто используете следующий.Суть в том, что вам нужно знать предыдущий.Движки Dbase никогда не имеют проблем с этим, их точка зрения запоминает вещи.

Используйте столбец с автоинкрементом.

2 голосов
/ 09 ноября 2011

Просто чтобы уйти от этого, вы знаете, что GetHashCode() не генерирует ничего уникального, верно? Две совершенно разные строки могут возвращать один и тот же хэш-код. Алгоритм предназначен только для создания равномерного распределения объектов в хеш-таблице.

Изо рта лошади :

Реализация по умолчанию метода GetHashCode не гарантировать уникальные возвращаемые значения для различных объектов.

Кроме того, правила для того, что происходит, когда вы звоните GetHashCode() , могут и будут меняться со временем. См. Раздел «Правило: потребители GetHashCode не могут полагаться на его стабильность во времени или во всех доменах приложения» здесь , в частности:

Это укусило людей в прошлом. Документация для System.String.GetHashCode особо отмечает, что два идентичных строки могут иметь разные хеш-коды в разных версиях CLR, а на самом деле они делают. Не храните строковые хеши в базах данных и ожидайте, что они будут такими же навсегда, потому что они не будут такими.

Чтобы увидеть чью-то работу по обнаружению столкновений, проверьте это.

0 голосов
/ 09 ноября 2011

Есть ли конкретная причина, по которой вы выбрали 64 бит? MD5 - это больше для проверки того, что контент не изменился случайно, а SHA - для того, чтобы убедиться, что контент не был изменен специально. Я бы определенно использовал по крайней мере SHA1.

...