У меня есть простой вопрос, который возник, когда я хотел сохранить результат хэша SHA1 в базе данных MySQL:
Как долго должно быть поле VARCHAR, в котором я храню результат хеширования?
mysql
database-design
hash
sha1
niklasfi
источник
источник
Ответы:
Я бы использовал
VARCHAR
для данных переменной длины, но не с данными фиксированной длины. Поскольку значение SHA-1 всегда имеет длину 160 битов,VARCHAR
он просто тратит дополнительный байт на длину поля фиксированной длины .И я также не буду хранить значение,
SHA1
которое возвращается. Потому что он использует только 4 бита на символ и, следовательно, потребует 160/4 = 40 символов. Но если вы используете 8 бит на символ, вам потребуется только поле длиной 160/8 = 20 символов.Поэтому я рекомендую вам использовать
BINARY(20)
иUNHEX
функцию для преобразованияSHA1
значения в двоичное.Я сравнил требования к хранилищу для
BINARY(20)
иCHAR(40)
.С миллиона записей
binary(20)
уходит 44,56 млн, аchar(40)
уходит 64,57 млн.InnoDB
двигатель.источник
UNHEX()
вручную в SQL.Хэш SHA1 - 40 символов!
источник
Ссылка взята из этого блога:
Ниже приведен список алгоритма хеширования вместе с размером требуемого бита:
Создан один пример таблицы с требованием CHAR (n):
источник
Выходной размер sha1 составляет 160 бит. Это 160/8 == 20 символов (если вы используете 8-разрядные символы) или 160/16 = 10 (если вы используете 16-разрядные символы).
источник
Таким образом, длина составляет от 10 16-битных символов до 40 шестнадцатеричных цифр.
В любом случае выберите формат, который вы собираетесь хранить, и установите для поля фиксированный размер на основе этого формата. Таким образом, у вас не будет пустого места.
источник
Вы все еще можете использовать VARCHAR в тех случаях, когда вы не всегда сохраняете хеш для пользователя (то есть аутентификация учетных записей / забытый URL-адрес входа в систему). Как только пользователь подтвердил подлинность / изменил свою регистрационную информацию, он не сможет использовать хэш и не будет иметь для этого никаких оснований. Вы можете создать отдельную таблицу для хранения временного хеша -> ассоциации пользователей, которые могут быть удалены, но я не думаю, что большинство людей делают это.
источник
Если вам нужен индекс для столбца sha1, я предлагаю CHAR (40) по соображениям производительности. В моем случае столбец sha1 является токеном подтверждения электронной почты, поэтому на целевую страницу запрос поступает только с токеном. В этом случае CHAR (40) с INDEX, на мой взгляд, является лучшим выбором :)
Если вы хотите принять этот метод, не забудьте оставить $ raw_output = false.
источник