Saya punya pertanyaan sederhana yang muncul ketika saya ingin menyimpan hasil hash SHA1 dalam database MySQL:
Berapa lama bidang VARCHAR berada di tempat saya menyimpan hasil hash?
Saya punya pertanyaan sederhana yang muncul ketika saya ingin menyimpan hasil hash SHA1 dalam database MySQL:
Berapa lama bidang VARCHAR berada di tempat saya menyimpan hasil hash?
Jawaban:
Saya akan menggunakan VARCHAR
untuk data panjang variabel, tetapi tidak dengan data panjang tetap. Karena nilai SHA-1 selalu panjang 160 bit, VARCHAR
hanya akan membuang byte tambahan untuk panjang bidang panjang tetap .
Dan saya juga tidak akan menyimpan nilai yang SHA1
dikembalikan. Karena hanya menggunakan 4 bit per karakter dan dengan demikian akan membutuhkan 160/4 = 40 karakter. Tetapi jika Anda menggunakan 8 bit per karakter, Anda hanya perlu bidang 160/8 = 20 karakter.
Jadi saya sarankan Anda untuk menggunakan BINARY(20)
dan UNHEX
fungsinya untuk mengubah SHA1
nilai menjadi biner.
Saya membandingkan persyaratan penyimpanan untuk BINARY(20)
dan 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
);
Dengan jutaan catatan, binary(20)
dibutuhkan 44,56 juta, sementara char(40)
64,57 juta.
InnoDB
mesin.
UNHEX()
secara manual ke sql.
Panjang hash SHA1 adalah 40 karakter!
Referensi diambil dari blog ini:
Di bawah ini adalah daftar algoritma hashing beserta ukuran bit yang dibutuhkan:
Dibuat satu tabel sampel dengan membutuhkan 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)
);
Jadi panjangnya antara 10 karakter 16-bit, dan 40 digit hex.
Dalam kasus apa pun, tentukan format yang akan Anda simpan, dan jadikan bidang itu ukuran tetap berdasarkan format itu. Dengan begitu Anda tidak akan memiliki ruang kosong.
Anda mungkin masih ingin menggunakan VARCHAR dalam kasus di mana Anda tidak selalu menyimpan hash untuk pengguna (yaitu mengautentikasi akun / lupa url login). Setelah pengguna mengautentikasi / mengubah info masuk mereka, mereka seharusnya tidak dapat menggunakan hash dan seharusnya tidak punya alasan untuk itu. Anda dapat membuat tabel terpisah untuk menyimpan hash -> asosiasi pengguna sementara yang dapat dihapus tapi saya rasa kebanyakan orang tidak repot-repot melakukan ini.
Jika Anda memerlukan indeks pada kolom sha1, saya sarankan CHAR (40) karena alasan kinerja. Dalam kasus saya, kolom sha1 adalah token konfirmasi email, jadi pada halaman landing kueri hanya masuk dengan token. Dalam hal ini CHAR (40) dengan INDEX, menurut pendapat saya, adalah pilihan terbaik :)
Jika Anda ingin mengadopsi metode ini, jangan lupa untuk meninggalkan $ raw_output = false.