Oracle如何生成RAW(8)长度哈希?替代STANDARD_HASH的方案
问题解答
现成实现方法说明
Oracle没有直接生成RAW(8)长度哈希的内置函数,不管是STANDARD_HASH还是其他原生哈希函数,都输出标准长度的哈希值(比如SHA1固定为20字节/40位RAW)。
用DBMS_CRYPTO生成RAW(8)哈希的方案
可以通过截断标准哈希结果或者选用短哈希算法后截断两种方式实现:
方式1:截断SHA1哈希结果
先通过DBMS_CRYPTO生成完整的SHA1哈希,再截取前8字节(对应16位RAW字符):
SELECT SUBSTR(DBMS_CRYPTO.HASH(UTL_I18N.STRING_TO_RAW(x, 'AL32UTF8'), DBMS_CRYPTO.HASH_SH1), 1, 8) AS raw8_hash, LENGTH(SUBSTR(DBMS_CRYPTO.HASH(UTL_I18N.STRING_TO_RAW(x, 'AL32UTF8'), DBMS_CRYPTO.HASH_SH1), 1, 8)) AS hash_length FROM ( SELECT 'aa' x FROM dual UNION ALL SELECT 'bb' x FROM dual UNION ALL SELECT 'cc' x FROM dual );
注意:截断操作会降低哈希的唯一性,碰撞概率会升高,需根据业务场景评估风险。
方式2:基于短哈希算法截断
如果业务允许,可选择本身输出长度更短的哈希算法(比如MD5为16字节),再截取前8字节:
SELECT SUBSTR(DBMS_CRYPTO.HASH(UTL_I18N.STRING_TO_RAW(x, 'AL32UTF8'), DBMS_CRYPTO.HASH_MD5), 1, 8) AS raw8_hash, LENGTH(SUBSTR(DBMS_CRYPTO.HASH(UTL_I18N.STRING_TO_RAW(x, 'AL32UTF8'), DBMS_CRYPTO.HASH_MD5), 1, 8)) AS hash_length FROM ( SELECT 'aa' x FROM dual UNION ALL SELECT 'bb' x FROM dual UNION ALL SELECT 'cc' x FROM dual );
权限说明
使用DBMS_CRYPTO需要用户拥有EXECUTE权限,可通过以下语句授权:
GRANT EXECUTE ON SYS.DBMS_CRYPTO TO your_username;
内容的提问来源于stack exchange,提问作者Vijay
相关产品推荐
相关产品推荐

