У меня есть простой вопрос, который возник, когда я хотел сохранить результат хэш 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.56M, а CHAR(40)
- 64.57M.
InnoDB
двигатель.
Хэш 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')
,SHA1('SamplePass')
,SHA2('SamplePass',224)
,SHA2('SamplePass',256)
,SHA2('SamplePass',384)
,SHA2('SamplePass',512)
);
Размер вывода 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.