Каковы другие функции, связанные с хэш-ключом, для ключей таблицы БД?

Мы используем функцию Hash-Key для одной из исходных таблиц, чтобы создать уникальный ключ-идентификатор. Но функция Hash-Key имеет некоторые ограничения по отношению к 32-битному целому числу. Мы пытались использовать MD5, но мы не хотим использовать ключ на основе Char для данных на основе Char.


person neiodavince    schedule 06.05.2015    source источник
comment
Если у вас нет уникальных входных данных, у вас не может быть уникальных выходных хэшей, независимо от того, что вы пытаетесь сделать.   -  person deviantfan    schedule 07.05.2015


Ответы (1)


Вы можете найти этот вопрос, который я задал, интересным для дальнейшего чтения. Один из ответов ссылается на эту страницу документации MySQL. который предлагает использовать поле VARBINARY для строк с произвольными значениями байтов. Вы не отметили свой вопрос, поэтому я сформулирую остальную часть этого ответа с точки зрения MySQL; надеюсь, выбранная вами РСУБД не слишком сложна для перевода.

Многие функции шифрования и сжатия возвращают строки, результат которых может содержать произвольные значения байтов. Если вы хотите сохранить эти результаты, используйте столбец с двоичным строковым типом данных VARBINARY или BLOB. Это позволит избежать потенциальных проблем с удалением завершающего пробела или преобразованием набора символов, которые могут изменить значения данных, например, если вы используете недвоичный строковый тип данных (CHAR, VARCHAR, TEXT).

Выход хэш-функции — это очень длинное число. Вы часто видите их как строки, потому что многие библиотеки кода отображают их в каком-то закодированном формате (шестнадцатеричном или Base32). Как говорится в вашем вопросе, помещать их в недвоичные строковые поля - плохая идея и пустая трата места и времени поиска. Поэтому заставьте ваше приложение преобразовывать вывод хэша в двоичные данные (чаще всего byte[]) и сохранять их в столбце VARBINARY.

Другой вариант — оставить его в виде строки и закодировать в Base32 (5 бит на байт), что занимает значительно меньше места, чем шестнадцатеричное (4 бита на байт) — на 25% меньше, если быть точным. Главное преимущество этого заключается в том, что строки остаются удобочитаемыми для человека и могут передаваться по обычным протоколам без дальнейшего кодирования. Это упрощает сопоставление вашей базы данных с видимыми в Интернете данными, что может сэкономить много времени на разработку и отладку. Затем установите для столбца тип сопоставления _bin, что ускоряет сравнение ценой потери чувствительности к регистру.

Обратите внимание, что вы не можете использовать этот трюк с кодировкой Base64 (6 бит на байт), потому что вывод base64 сам по себе чувствителен к регистру.

person Patrick M    schedule 07.05.2015