Chọn đúng thuật toán trong hàm HashBytes


20

Chúng ta cần tạo giá trị băm của dữ liệu nvarchar cho mục đích so sánh. Có nhiều thuật toán băm có sẵn trong T-SQL, nhưng cái nào là tốt nhất để chọn trong kịch bản này?

Chúng tôi muốn đảm bảo rủi ro có giá trị băm trùng lặp cho hai giá trị nvarchar khác nhau là mức tối thiểu. Dựa trên nghiên cứu của tôi trên internet MD5 có vẻ là tốt nhất. Có đúng không? MSDN cho chúng tôi (liên kết bên dưới) về các thuật toán có sẵn, nhưng không có mô tả về cái nào cho điều kiện nào?

HASHBYTES (Giao dịch-SQL)

Chúng ta cần nối hai bảng trên hai cột nvarchar (max). Như bạn có thể tưởng tượng truy vấn mất thời gian để thực hiện. Chúng tôi nghĩ sẽ tốt hơn nếu giữ giá trị băm của từng dữ liệu nvarchar (max) và thực hiện phép nối trên các giá trị băm thay vì giá trị nvarchar (max) là các đốm màu. Câu hỏi đặt ra là thuật toán băm nào cung cấp tính duy nhất, để chúng ta không gặp rủi ro khi có một giá trị băm cho nhiều hơn một nvarchar (tối đa).

Câu trả lời:


18

Các HASHBYTESchức năng chỉ mất lên đến 8000 byte như là đầu vào. Bởi vì đầu vào của bạn có khả năng lớn hơn thế, các bản sao trong phạm vi của trường được băm sẽ gây ra xung đột, bất kể thuật toán được chọn. Xem xét cẩn thận phạm vi dữ liệu bạn dự định băm - sử dụng 4000 ký tự đầu tiên là lựa chọn rõ ràng , nhưng có thể không phải là lựa chọn tốt nhất cho dữ liệu của bạn.

Trong mọi trường hợp, do hàm băm là gì, ngay cả khi đầu vào là 8000 byte trở xuống, cách duy nhất để đảm bảo chính xác 100% trong kết quả là so sánh các giá trị cơ sở tại một số điểm (đọc: không nhất thiết phải trước tiên ). Giai đoạn.

Doanh nghiệp sẽ đưa ra quyết định có yêu cầu độ chính xác 100% hay không. Điều này sẽ cho bạn biết rằng (a) so sánh các giá trị cơ sở là bắt buộc hoặc (b) bạn nên cân nhắc không so sánh các giá trị cơ sở - nên đánh đổi độ chính xác bao nhiêu cho hiệu suất.

Mặc dù các va chạm băm có thể có trong một bộ đầu vào duy nhất, nhưng chúng cực kỳ hiếm, bất kể thuật toán được chọn. Toàn bộ ý tưởng sử dụng giá trị băm trong kịch bản này là thu hẹp hiệu quả các kết quả tham gia thành một tập hợp dễ quản lý hơn, không nhất thiết phải đi đến tập kết quả cuối cùng ngay lập tức. Một lần nữa, với độ chính xác 100%, đây không thể là bước cuối cùng trong quy trình. Kịch bản này không sử dụng băm cho mục đích mã hóa, do đó, một thuật toán như MD5 sẽ hoạt động tốt.

Tôi sẽ rất khó để biện minh cho việc chuyển sang thuật toán SHA-x cho mục đích "chính xác" bởi vì nếu doanh nghiệp sẽ phát cuồng về khả năng va chạm rất nhỏ của MD5, rất có thể họ cũng sẽ phát hiện ra rằng các thuật toán SHA-x cũng không hoàn hảo. Họ hoặc phải đi đến thỏa thuận với sự thiếu chính xác nhỏ, hoặc yêu cầu truy vấn phải chính xác 100% và sống với các hàm ý kỹ thuật liên quan. Tôi cho rằng nếu CEO ngủ ngon hơn vào ban đêm khi biết bạn đã sử dụng SHA-x thay vì MD5, tốt, tốt; nó vẫn không có ý nghĩa nhiều từ quan điểm kỹ thuật trong trường hợp này.

Nói về hiệu suất, nếu các bảng được đọc chủ yếu và thường xuyên cần kết quả tham gia, hãy xem xét thực hiện chế độ xem được lập chỉ mục để loại bỏ nhu cầu tính toán toàn bộ liên kết mỗi khi được yêu cầu. Tất nhiên bạn đánh đổi lưu trữ cho điều đó, nhưng nó có thể có giá trị để cải thiện hiệu suất, đặc biệt nếu cần độ chính xác 100%.

Để đọc thêm về lập chỉ mục các giá trị chuỗi dài, tôi đã xuất bản một bài viết hướng dẫn một ví dụ về cách thực hiện điều này cho một bảng duy nhất và trình bày những điều cần xem xét khi thử kịch bản đầy đủ trong câu hỏi này.


8

MD5 sẽ ổn và đầu ra có thể được lưu trữ ở dạng nhị phân (16). Xác suất va chạm (xem nghịch lý sinh nhật ) vẫn rất thấp, ngay cả với cỡ mẫu vật lý lớn. Đầu ra của SHA-1 mất 20 byte và đầu ra của SHA-256 mất 32 byte. Trừ khi bạn có số lượng hồ sơ lớn đến mức xác suất va chạm sinh nhật của bạn trở nên đáng kể (không thể thực hiện được hoặc ít nhất là không thực tế với các công nghệ phần cứng hiện tại) thì có thể sẽ ổn.



0

Tôi chưa thấy điều này được đề cập trong các câu trả lời nhưng mỗi MSDN :

Bắt đầu với SQL Server 2016 (13.x), tất cả các thuật toán khác ngoài SHA2_256 và SHA2_512 đều không được chấp nhận. Các thuật toán cũ hơn (không được khuyến nghị) sẽ tiếp tục hoạt động, nhưng chúng sẽ gây ra sự kiện phản đối.

Tôi đã hỏi một câu hỏi tương tự , tùy thuộc vào bạn nếu bạn muốn sử dụng chức năng không dùng nữa, chẳng hạn như MD5 (nếu bạn đang trên 2016+). Bạn có thể thực hiện kiểm tra để xem có bao nhiêu sự khác biệt trong lưu trữ và hiệu suất giữa MD5 và SHA2.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.