Tôi có một câu hỏi đơn giản xảy ra khi tôi muốn lưu trữ kết quả của hàm băm SHA1 trong cơ sở dữ liệu MySQL:
Trường VARCHAR sẽ tồn tại trong bao lâu để tôi lưu trữ kết quả của hàm băm?
Tôi có một câu hỏi đơn giản xảy ra khi tôi muốn lưu trữ kết quả của hàm băm SHA1 trong cơ sở dữ liệu MySQL:
Trường VARCHAR sẽ tồn tại trong bao lâu để tôi lưu trữ kết quả của hàm băm?
Câu trả lời:
Tôi sẽ sử dụng VARCHAR
cho dữ liệu chiều dài thay đổi, nhưng không phải với dữ liệu chiều dài cố định. Vì giá trị SHA-1 luôn dài 160 bit, nên VARCHAR
sẽ chỉ lãng phí một byte bổ sung cho độ dài của trường có độ dài cố định .
Và tôi cũng sẽ không lưu trữ giá trị SHA1
đang trở lại. Bởi vì nó chỉ sử dụng 4 bit cho mỗi ký tự và do đó sẽ cần 160/4 = 40 ký tự. Nhưng nếu bạn sử dụng 8 bit cho mỗi ký tự, bạn sẽ chỉ cần một trường dài 160/8 = 20 ký tự.
Vì vậy, tôi khuyên bạn nên sử dụng BINARY(20)
và UNHEX
chức năng để chuyển đổi SHA1
giá trị thành nhị phân.
Tôi so sánh các yêu cầu lưu trữ cho BINARY(20)
và 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
);
Với hàng triệu hồ sơ binary(20)
mất 44,56M, trong khi char(40)
mất 64,57M.
InnoDB
động cơ.
UNHEX()
thủ công vào sql.
Một băm SHA1 dài 40 ký tự!
Dưới đây là danh sách các thuật toán băm cùng với kích thước bit yêu cầu của nó:
Tạo một bảng mẫu với yêu cầu 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)
);
Vì vậy, độ dài nằm trong khoảng 10 ký tự 16 bit và 40 chữ số hex.
Trong mọi trường hợp, hãy quyết định định dạng bạn sẽ lưu trữ và đặt trường có kích thước cố định dựa trên định dạng đó. Bằng cách đó, bạn sẽ không có bất kỳ không gian lãng phí.
Bạn vẫn có thể muốn sử dụng VARCHAR trong trường hợp bạn không luôn lưu trữ hàm băm cho người dùng (nghĩa là xác thực tài khoản / quên url đăng nhập). Khi người dùng đã xác thực / thay đổi thông tin đăng nhập, họ không thể sử dụng hàm băm và không có lý do gì để làm. Bạn có thể tạo một bảng riêng để lưu trữ băm tạm thời -> các liên kết người dùng có thể bị xóa nhưng tôi không nghĩ rằng hầu hết mọi người bận tâm để làm điều này.
Nếu bạn cần một chỉ mục trên cột sha1, tôi đề nghị CHAR (40) vì lý do hiệu suất. Trong trường hợp của tôi, cột sha1 là mã thông báo xác nhận email, vì vậy trên trang đích, truy vấn chỉ nhập bằng mã thông báo. Trong trường hợp này CHAR (40) với INDEX, theo tôi, là sự lựa chọn tốt nhất :)
Nếu bạn muốn áp dụng phương pháp này, hãy nhớ để lại $ rawDefput = false.