Bir MySQL veritabanında bir SHA1 karma sonucu saklamak istediğinde oluşan basit bir soru var:
Karma sonucunu sakladığım VARCHAR alanı ne kadar olmalıdır ?
Bir MySQL veritabanında bir SHA1 karma sonucu saklamak istediğinde oluşan basit bir soru var:
Karma sonucunu sakladığım VARCHAR alanı ne kadar olmalıdır ?
Yanıtlar:
VARCHAR
Değişken uzunluklu veriler için kullanırım , ancak sabit uzunluklu verilerle kullanmam. SHA-1 değeri olduğu için , her zaman 160 bit uzunluğunda, VARCHAR
sadece israf sabit uzunluklu alan uzunluğu için ek bir bayt .
Ve ben de SHA1
dönen değeri saklamak olmaz . Çünkü karakter başına sadece 4 bit kullanır ve bu nedenle 160/4 = 40 karaktere ihtiyaç duyar. Ancak karakter başına 8 bit kullanırsanız, yalnızca 160/8 = 20 karakter uzunluğunda bir alana ihtiyacınız olur.
Ben tavsiye Yani kullanmak BINARY(20)
ve UNHEX
fonksiyon dönüştürmek için SHA1
ikili değer.
Ben depolama gereksinimleri karşılaştırıldı BINARY(20)
ve 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
);
Milyon binary(20)
kayıtla 44.56M, char(40)
64.57M alır.
InnoDB
motor.
UNHEX()
el ile sql eklerseniz çalışır .
Bir SHA1 karması 40 karakter uzunluğundadır!
Aşağıda, bit büyüklüğü ile birlikte karma algoritmanın bir listesi bulunmaktadır:
CHAR (n) gerektiren bir örnek tablo oluşturuldu:
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)
);
Yani uzunluk 10 16 bit karakter ile 40 onaltılık basamak arasındadır.
Her durumda saklayacağınız biçime karar verin ve alanı bu biçime göre sabit bir boyut yapın. Bu şekilde boşa giden bir alan kalmaz.
Kullanıcı için her zaman bir karma saklamadığınız durumlarda VARCHAR'ı kullanmak isteyebilirsiniz (örneğin, kimlik doğrulama / giriş URL'sini unuttum). Kullanıcı giriş bilgilerini doğruladıktan / değiştirdikten sonra karmayı kullanamamalı ve bunun için bir neden olmamalıdır. Silinebilecek geçici karma -> kullanıcı ilişkilendirmelerini saklamak için ayrı bir tablo oluşturabilirsiniz, ancak çoğu insanın bunu yapmaktan rahatsız olduğunu düşünmüyorum.
Sha1 sütununda bir dizine ihtiyacınız varsa, performans nedenleriyle CHAR (40) öneririm. Benim durumumda sha1 sütunu bir e-posta onay jetonudur, bu nedenle açılış sayfasında sorgu yalnızca jetonla girilir. Bu durumda, INDEX ile CHAR (40), bence, en iyi seçimdir :)
Bu yöntemi uygulamak istiyorsanız, $ raw_output = false komutunu bırakmayı unutmayın.