Như bạn đã biết, ora_hash
không chấp nhận long
hoặc các giá trị LOB. Bạn có thể chuyển 4k hoặc 32k đầu tiên của nội dung XML, nhưng nếu bạn cần đảm bảo rằng toàn bộ tài liệu XML không thay đổi, điều đó sẽ không đủ. Và như Ben đã đề cập, ora_hash
có tối đa 4294967295 nhóm, do đó, có nhiều khả năng xảy ra va chạm hơn với SHA-1 hoặc MD5. Như tài liệu cho biết, ora_hash
'hữu ích cho các hoạt động như phân tích một tập hợp con dữ liệu và tạo một mẫu ngẫu nhiên'.
Bạn có thể sử dụng dbms_crypto
gói để băm toàn bộ giá trị XMLType, dưới dạng CLOB được trích xuất bằng getClobVal
, với một hàm wrapper để sử dụng đơn giản hơn:
create or replace function my_hash(xml xmltype) return raw is
begin
return dbms_crypto.hash(src=>xml.getclobval(), typ=>dbms_crypto.hash_sh1);
end;
/
Sau đó, bạn có thể chuyển vào XMLType của mình, dưới dạng một giá trị hoặc một cột như một phần của lựa chọn:
select my_hash(xml) from t42;
MY_HASH(XML)
---------------------------------------------
494C4E7688963BCF312B709B33CD1B5CCA7C0289