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?
mysql
database-design
hash
sha1
niklasfi
sumber
sumber
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)
danUNHEX
fungsinya untuk mengubahSHA1
nilai menjadi biner.Saya membandingkan persyaratan penyimpanan untuk
BINARY(20)
danCHAR(40)
.Dengan jutaan catatan,
binary(20)
dibutuhkan 44,56 juta, sementarachar(40)
64,57 juta.InnoDB
mesin.sumber
UNHEX()
secara manual ke sql.Panjang hash SHA1 adalah 40 karakter!
sumber
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):
sumber
Ukuran output dari sha1 adalah 160 bit. Yaitu 160/8 == 20 karakter (jika Anda menggunakan karakter 8-bit) atau 160/16 = 10 (jika Anda menggunakan karakter 16-bit).
sumber
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.
sumber
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.
sumber
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.
sumber