Phương pháp nào nhanh hơn?
Tôi chưa đánh dấu sự cố này, nhưng tôi đoán rằng DBMS_SQLHASH là nhanh nhất, vì nó được xây dựng chính xác cho loại vấn đề này.
Đây là một gói chính thức, nhưng không được ghi rõ trong Bảo mật Hướng dẫn
. Nó không có trong trang 5.964 (!) Tham chiếu các loại và gói PL / SQL và bạn cần grant execute on dbms_sqlhash to [user];
để nó hoạt động, đó có lẽ là lý do tại sao hầu như không ai biết đến nó.
Ví dụ:
select sys.DBMS_SQLHASH.GETHASH(sqltext=>'select 1 from dual', digest_type=>1)
from dual;
dig_type:1 =HASH_MD4, 2 =HASH_MD5, 3 =HASH_SH1
Có thể xảy ra va chạm
Có một số câu hỏi về khả năng xảy ra va chạm: Hash Collision - cơ hội là gì? , Có thể hai chuỗi khác nhau không tạo cùng một mã băm MD5?
Tôi không chắc chính xác điều gì sẽ xảy ra với cơ hội khi bạn bắt đầu tính tổng nhiều hàng, nhưng khả năng xảy ra va chạm là rất thấp nên có lẽ bạn vẫn ổn.
Tôi không biết toán học, nhưng tôi chắc chắn rằng nguyên nhân có thể xảy ra va chạm nhất là do lỗi lập trình nếu bạn cố viết hàm của riêng mình.
Tôi đã từng xem và xây dựng các kịch bản giống như thế này, và có nhiều cách tinh tế để hoàn thiện nó. Ví dụ:giá trị null và hoán đổi giá trị giữa các hàng hoặc cột. Mặc dù bây giờ bạn chỉ sử dụng một cột, nhưng để ngăn ai đó viết một trong những tập lệnh xấu xí đó, bạn nên sử dụng gói được cung cấp của Oracle bất cứ khi nào có thể.