У мене є просте запитання, яке виникало, коли я хотів зберегти результат хеша SHA1 в базі даних MySQL:
Як довго має бути поле VARCHAR, в якому я зберігаю результат хешу?
У мене є просте запитання, яке виникало, коли я хотів зберегти результат хеша SHA1 в базі даних MySQL:
Як довго має бути поле VARCHAR, в якому я зберігаю результат хешу?
Відповіді:
Я б використовував VARCHAR
для даних змінної довжини, але не для даних фіксованої довжини. Оскільки значення SHA-1 завжди 160 біт, VARCHAR
то просто витрачається додатковий байт для довжини поля фіксованої довжини .
І я також не зберігав би значення, SHA1
яке повертається. Тому що для цього використовується всього 4 біта на символ, і тому знадобиться 160/4 = 40 символів. Але якщо ви використовуєте 8 біт на символ, вам знадобиться лише поле 160/8 = 20 символів.
Тому я рекомендую вам використовувати BINARY(20)
та UNHEX
функцію для перетворення SHA1
значення у бінарне.
Я порівняв вимоги щодо зберігання для BINARY(20)
та CHAR(40)
.
CREATE TABLE `binary` (
`id` int unsigned auto_increment primary key,
`password` binary(20) not null
);
CREATE TABLE `char` (
`id` int unsigned auto_increment primary key,
`password` char(40) not null
);
З мільйонами записів binary(20)
займає 44,56 млн, тоді як char(40)
займає 64,57 млн.
InnoDB
двигун.
UNHEX()
вручну до sql.
Хеш SHA1 - 40 символів!
Нижче наведено список алгоритму хешування, а також його необхідний розмір бітів:
Створено одну зразкову таблицю з вимогою CHAR (n):
CREATE TABLE tbl_PasswordDataType
(
ID INTEGER
,MD5_128_bit CHAR(32)
,SHA_160_bit CHAR(40)
,SHA_224_bit CHAR(56)
,SHA_256_bit CHAR(64)
,SHA_384_bit CHAR(96)
,SHA_512_bit CHAR(128)
);
INSERT INTO tbl_PasswordDataType
VALUES
(
1
,MD5('SamplePass_WithAddedSalt')
,SHA1('SamplePass_WithAddedSalt')
,SHA2('SamplePass_WithAddedSalt',224)
,SHA2('SamplePass_WithAddedSalt',256)
,SHA2('SamplePass_WithAddedSalt',384)
,SHA2('SamplePass_WithAddedSalt',512)
);
Отже, довжина становить 10 10-бітних символів та 40-ти шістнадцяткових цифр.
У будь-якому випадку визначте формат, який ви збираєтесь зберігати, і зробіть поле фіксованого розміру, виходячи з цього формату. Таким чином у вас не буде зайвого місця.
Ви все ще можете використовувати VARCHAR у випадках, коли ви не завжди зберігаєте хеш для користувача (наприклад, автентифікація облікових записів / забутий URL для входу). Після того, як користувач підтвердив / змінив інформацію про вхід, він не повинен мати можливість використовувати хеш і не повинен мати жодних причин. Ви можете створити окрему таблицю для зберігання тимчасових хеш -> асоціацій користувачів, які можна видалити, але я не думаю, що більшість людей це заважають.
Якщо вам потрібен індекс у колонці sha1, я пропоную CHAR (40) з міркувань продуктивності. У моєму випадку стовпець sha1 - це маркер підтвердження електронною поштою, тому на цільовій сторінці запит вводиться лише з маркером. У цьому випадку CHAR (40) з INDEX, на мій погляд, найкращий вибір :)
Якщо ви хочете прийняти цей метод, не забудьте залишити $ raw_output = false.