ฉันมีคำถามง่าย ๆ ที่เกิดขึ้นเมื่อฉันต้องการเก็บผลลัพธ์ของการแฮช SHA1 ในฐานข้อมูล MySQL:
นานแค่ไหนที่ควรVARCHARข้อมูลจะอยู่ในที่ฉันเก็บผลกัญชาหรือไม่
ฉันมีคำถามง่าย ๆ ที่เกิดขึ้นเมื่อฉันต้องการเก็บผลลัพธ์ของการแฮช SHA1 ในฐานข้อมูล MySQL:
นานแค่ไหนที่ควรVARCHARข้อมูลจะอยู่ในที่ฉันเก็บผลกัญชาหรือไม่
คำตอบ:
ฉันจะใช้VARCHAR
สำหรับข้อมูลความยาวผันแปรได้ แต่ไม่ใช่ข้อมูลความยาวคงที่ เพราะค่า SHA-1 เป็นเสมอ 160 บิตนานVARCHAR
ก็จะเสียไบต์เพิ่มเติมสำหรับความยาวของสนามคงยาว
และฉันก็จะไม่เก็บค่าที่SHA1
จะกลับมา เพราะมันใช้เพียง 4 บิตต่อตัวละครดังนั้นจะต้องมี 160/4 = 40 ตัวอักษร แต่ถ้าคุณใช้ 8 บิตต่อตัวอักษรคุณจะต้องมีฟิลด์ที่มีความยาว 160/8 = 20 ตัวอักษรเท่านั้น
ดังนั้นฉันขอแนะนำให้คุณใช้BINARY(20)
และUNHEX
ฟังก์ชั่นการแปลง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)
ใช้เวลา 44.56 ล้านขณะที่char(40)
ใช้เวลา 64.57 ล้าน
InnoDB
เครื่องยนต์
UNHEX()
sql ด้วยตนเอง
แฮช SHA1 ยาว 40 ตัวอักษร!
ด้านล่างเป็นรายการของอัลกอริทึมการแปลงแป้นพิมพ์พร้อมกับขนาดบิตที่ต้องการ
สร้างตารางตัวอย่างหนึ่งตารางโดยต้องการ 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)
);
ขนาดเอาต์พุตของ sha1 คือ 160 บิต ตัวไหนคือ 160/8 == 20 ตัวอักษร (ถ้าคุณใช้ 8-bit chars) หรือ 160/16 = 10 (ถ้าคุณใช้ 16-bit chars)
ดังนั้นความยาวจึงอยู่ระหว่าง 10 16- บิตตัวอักษรและ 40 ฐานสิบหก
ไม่ว่าในกรณีใดให้เลือกรูปแบบที่คุณกำลังจะจัดเก็บและทำให้ฟิลด์มีขนาดคงที่ตามรูปแบบนั้น ด้วยวิธีนี้คุณจะไม่มีพื้นที่ว่างเปล่า
คุณอาจยังต้องการใช้ VARCHAR ในกรณีที่คุณไม่ได้เก็บแฮชไว้สำหรับผู้ใช้เสมอ (เช่นการตรวจสอบสิทธิ์บัญชี / ลืม URL ล็อกอิน) เมื่อผู้ใช้รับรองความถูกต้อง / เปลี่ยนข้อมูลการเข้าสู่ระบบพวกเขาไม่ควรใช้แฮชและไม่ควรมีเหตุผล คุณสามารถสร้างตารางแยกต่างหากเพื่อเก็บแฮชชั่วคราว -> การเชื่อมโยงผู้ใช้ที่สามารถลบได้ แต่ฉันไม่คิดว่าคนส่วนใหญ่จะสนใจที่จะทำสิ่งนี้
หากคุณต้องการดัชนีในคอลัมน์ sha1 ฉันแนะนำ CHAR (40) ด้วยเหตุผลด้านประสิทธิภาพ ในกรณีของฉันคอลัมน์ sha1 เป็นโทเค็นการยืนยันทางอีเมลดังนั้นในหน้า Landing Page แบบสอบถามจะเข้าสู่โทเค็นเท่านั้น ในกรณีนี้ CHAR (40) กับ INDEX ในความคิดของฉันเป็นตัวเลือกที่ดีที่สุด :)
หากคุณต้องการใช้วิธีนี้อย่าลืมปล่อยให้ $ raw_output = false