Выбор правильного алгоритма в функции HashBytes

20

Нам нужно создать хеш-значение данных nvarchar для сравнения. В T-SQL доступно несколько хеш-алгоритмов, но какой из них лучше выбрать в этом сценарии?

Мы хотим, чтобы риск наличия дублированного хеш-значения для двух разных значений nvarchar был минимальным. Основываясь на моих исследованиях в Интернете, MD5 кажется лучшим. Это правильно? MSDN сообщает нам (ссылка ниже) о доступных алгоритмах, но не дает описания, для каких из них и при каких условиях?

ХАШБИТЫ (Transact-SQL)

Нам нужно объединить две таблицы в двух столбцах nvarchar (max). Как вы можете себе представить, выполнение запроса занимает много времени. Мы подумали, что было бы лучше сохранить значение хеш-функции для всех данных nvarchar (max) и выполнить объединение значений хеш-функции, а не значений nvarchar (max), которые являются BLOB-объектами. Вопрос в том, какой алгоритм хеширования обеспечивает уникальность, поэтому мы не рискуем иметь одно хеш-значение для более чем одного nvarchar (max).

Небо
источник

Ответы:

18

HASHBYTESФункция принимает только до 8000 байт в качестве входных данных. Потому что ваши входы потенциально больше , чем, дублирует в пределах поля , которое получает хешировано будет вызывать коллизии, независимо от выбранного алгоритма. Тщательно продумайте диапазон данных, которые вы планируете хешировать - использование первых 4000 символов является очевидным выбором, но, возможно, не лучшим выбором для ваших данных.

В любом случае, из-за того, что представляет собой хеш-функция, даже если входные данные имеют размер 8000 байт или менее, единственный способ обеспечить 100% правильность результатов - это сравнить базовые значения в некоторой точке (читай: не обязательно сначала ). Период.

Бизнес будет диктовать, требуется ли точность 100%. Это скажет вам , что либо (а) сравнение базовых значений требуется , или (б) следует рассматривать не сравнивая базовые значения - сколько точность должна быть торгуемые от для повышения производительности.

Хотя коллизии хэшей возможны в уникальном входном наборе, они бесконечно малы, независимо от выбранного алгоритма. Вся идея использования значения хеш-функции в этом сценарии состоит в том, чтобы эффективно сузить результаты объединения до более управляемого набора, а не обязательно сразу получать окончательный набор результатов. Опять же, для 100% точности это не может быть последним шагом в процессе. Этот сценарий не использует хеширование для криптографии, поэтому алгоритм, такой как MD5, будет работать нормально.

Мне было бы крайне трудно оправдать переход к алгоритму SHA-x для «точности», потому что, если бизнес собирается волноваться о минимальных возможностях коллизий в MD5, есть вероятность, что они также будут волноваться, что алгоритмы SHA-x тоже не идеальны. Они либо должны смириться с небольшой неточностью, либо поручить, чтобы запрос был на 100% точным и соответствовал техническим последствиям. Я полагаю, если генеральный директор спит лучше ночью, зная, что вы использовали SHA-x вместо MD5, хорошо, хорошо; это все еще не значит много с технической точки зрения в этом случае.

Говоря о производительности, если таблицы в основном для чтения и часто требуется результат объединения, рассмотрите возможность реализации индексированного представления, чтобы исключить необходимость вычисления всего объединения каждый раз, когда оно запрашивается. Конечно, вы обмениваете хранилище на это, но это может стоить повышения производительности, особенно если требуется 100% точность.

Для дальнейшего чтения по индексированию длинных строковых значений я опубликовал статью, в которой рассматривается пример того, как сделать это для отдельной таблицы, и представлены вещи, которые следует учитывать при попытке полного сценария в этом вопросе.

Джон Сайгель
источник
8

MD5 должен быть в порядке, и вывод может быть сохранен в двоичном виде (16). Вероятность столкновения (см. Парадокс дня рождения ) все еще очень мала, даже при большом физическом размере выборки. Вывод SHA-1 занимает 20 байтов, а вывод SHA-256 занимает 32 байта. Если у вас нет такого большого количества записей, что вероятность вашего столкновения в день рождения станет значительной (физически невозможной или, по крайней мере, непрактичной при использовании современных аппаратных технологий), все будет в порядке.

ConcernedOfTunbridgeWells
источник
4

Я бы пошел с SHA-1, это лучший из доступных алгоритмов и имеет наименьшую вероятность столкновения из всех (2 ^ 51 по сравнению с MD5, что составляет 2 ^ 20,96). Также было доказано, что MD5 уязвим для столкновений в определенных сценариях.

Источники:

http://en.wikipedia.org/wiki/SHA-1 http://en.wikipedia.org/wiki/Comparison_of_cryptographic_hash_functions#Cryptanalysis http://en.wikipedia.org/wiki/MD5

Mr.Brownstone
источник
0

Я не видел это упоминается в ответах, но в MSDN :

Начиная с SQL Server 2016 (13.x), все алгоритмы, кроме SHA2_256 и SHA2_512, устарели. Старые алгоритмы (не рекомендуется) будут продолжать работать, но они вызовут событие устаревания.

Я задал похожий вопрос, так что вам решать, хотите ли вы использовать устаревшую функцию, такую ​​как MD5 (если вы используете версию 2016+). Вы можете провести тестирование, чтобы увидеть, насколько сильно разница между хранилищем и производительностью между MD5 и SHA2.

Гейб
источник