私は、MySQLデータベースにSHA1ハッシュの結果を保存したいときに発生した簡単な質問があります。
ハッシュの結果を保存するVARCHARフィールドの長さはどれくらいですか?
可変長データにはVARCHAR
を使用しますが、固定長データには使用しません。 SHA-1の値はalways160ビットなので、VARCHAR
は単に 長さの追加バイト固定長フィールド 。
また、 SHA1
が返す値を保存しません。 1文字につき4ビットしか使用しないため、160/4 = 40文字が必要になるためです。ただし、1文字あたり8ビットを使用する場合、必要なフィールドは160/8 = 20文字のみです。
したがって、 BINARY(20)
と UNHEX
function を使用して、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)
には64.57Mが必要ですが、char(40)
には100万件のレコードがあります。 InnoDB
エンジン。
SHA1ハッシュは40文字です!
以下は、ハッシュアルゴリズムとその必要なビットサイズのリストです:
require CHAR(n):で1つのサンプルテーブルを作成しました
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)
);
Sha1の出力サイズは160ビットです。 160/8 == 20文字(8ビット文字を使用する場合)または160/16 = 10(16ビット文字を使用する場合)です。
そのため、長さは10個の16ビット文字と40桁の16進数の間です。
いずれにしても、保存する形式を決定し、その形式に基づいてフィールドを固定サイズにします。そうすれば、無駄なスペースはありません。
Sha1列にインデックスが必要な場合は、パフォーマンス上の理由からCHAR(40)をお勧めします。私の場合、sha1列は電子メールの確認トークンであるため、ランディングページではクエリはトークンのみで入力されます。この場合、私の意見では、INDEX付きのCHAR(40)が最良の選択です。
この方法を採用する場合は、$ raw_output = falseのままにしてください。
ユーザーのハッシュを常に保存する必要がない場合(つまり、アカウントの認証/ログインURLを忘れた場合)でも、VARCHARを使用することができます。ユーザーがログイン情報を認証/変更したら、ハッシュを使用することはできず、理由もありません。一時的なハッシュを保存するための別のテーブルを作成することができます->削除できるユーザーの関連付けが、私はほとんどの人がこれを行うことを気にしないと思います。