5

ハッシュ化されたパスワード フィールドに使用するデータ型と長さなど、さまざまな推奨事項に基づいていますか? 、md5 を CHAR(32) または BINARY(16) として保存できます。しかし、BINARY(16) を使用すると、格納された値は CHAR(32) 格納された結果の最初の 16 文字とSELECT MD5()結果の最初の 16 文字と同じになります。後の 16 文字の意味は何ですか? また、バイナリ列に存在しないとデータが失われますか?

CREATE  TABLE test (id INT NOT NULL AUTO_INCREMENT, value VARCHAR(6), md5_char CHAR(32) NOT NULL, md5_binary BINARY(16) NOT NULL, PRIMARY KEY (id)) ENGINE = InnoDB;
INSERT INTO test(value,md5_char,md5_binary) VALUES("one!",md5("one!"),md5("one!"));
INSERT INTO test(value,md5_char,md5_binary) VALUES("two%",md5("two%"),md5("two%"));
INSERT INTO test(value,md5_char,md5_binary) VALUES("three~",md5("three~"),md5("three~"));
SELECT value,md5(value),md5_char,md5_binary FROM test;
DROP TABLE test;

+--------+----------------------------------+----------------------------------+------------------+
| value  | md5(value)                       | md5_char                         | md5_binary       |
+--------+----------------------------------+----------------------------------+------------------+
| one!   | 633c8403325f1cf963809e6eb224d77e | 633c8403325f1cf963809e6eb224d77e | 633c8403325f1cf9 |
| two%   | 48bbec047b4451a2018e0f652807b7d0 | 48bbec047b4451a2018e0f652807b7d0 | 48bbec047b4451a2 |
| three~ | fee453bb4eb68dcdfee07575e75c8cc5 | fee453bb4eb68dcdfee07575e75c8cc5 | fee453bb4eb68dcd |
+--------+----------------------------------+----------------------------------+------------------+
4

1 に答える 1

8

現在、 を使用すると、チェックサムの半分が失われていBINARY(16)ます。MD5 チェックサムを に保存するときは、16 進数でエンコードするのではなくBINARY(16)、バイナリ データとして保存する必要があります。あれは:

INSERT INTO test (md5_binary) VALUES(UNHEX(md5("one!")));

別のチェックサムと目で見て比較したい場合は、HEX 関数を使用して再度 16 進数にエンコードできます。

SELECT HEX(md5_binary) FROM test;

16 進テキストの代わりに BINARY を使用してチェックサムを格納する利点は、半分のストレージが必要になることです。

于 2013-09-28T17:35:29.127 に答える