我使用下面的方法在oracle中生成哈希:
select STANDARD_HASH(x, 'SHA1'), length(STANDARD_HASH(x, 'SHA1')) from (
select 'aa' x from dual union all
select 'bb' x from dual union all
select 'cc' x from dual
)
我需要长度为 RAW(8) 而不是 RAW(40) 的哈希值。有没有现成的方法可以做到这一点? 如果没有,有没有办法使用 DBMS_CRYPTO 生成长度为 RAW(8) 的哈希?
SHA-1 算法始终生成 160 位(20 字节)哈希值;您无法改变它的大小。
您看到 40 个字节,因为您使用的是
LENGTH
,它期望第一个参数是字符串,并且 RAW
被隐式转换为十六进制字符串,每个字节有两个十六进制字符,这使长度加倍。
如果您使用
UTL_RAW.LENGTH
生成输出,那么您将看到字节长度,而无需转换为字符串。
如果您只想要 8 个字节,那么您可以使用
UTL_RAW.SUBSTR
获取 SHA-1 哈希值的前 8 个字节:
SELECT STANDARD_HASH(x, 'SHA1') AS hash,
UTL_RAW.LENGTH(STANDARD_HASH(x, 'SHA1')) AS len,
UTL_RAW.SUBSTR(STANDARD_HASH(x, 'SHA1'), 1, 8) AS byte8_hash,
UTL_RAW.LENGTH(UTL_RAW.SUBSTR(STANDARD_HASH(x, 'SHA1'), 1, 8)) AS byte8_len
FROM table_name
对于样本数据:
CREATE TABLE table_name (x) AS
SELECT 'aa' x FROM DUAL UNION ALL
SELECT 'bb' x FROM DUAL UNION ALL
SELECT 'cc' x FROM DUAL
输出:
哈希 | 伦 | BYTE8_HASH | BYTE8_LEN |
---|---|---|---|
0xE0C9035898DD52FC65C41454CEC9C4D2611BFB37 | 20 | 0xE0C9035898DD52FC | 8 |
0x9A900F538965A426994E1E90600920AFF0B4E8D2 | 20 | 0x9A900F538965A426 | 8 |
0xBDB480DE655AA6EC75CA058C849C4FAF3C0F75B1 | 20 | 0xBDB480DE655AA6EC | 8 |