oracle 中的 standard_hash 或 dbms_crypto 生成的哈希长度

问题描述 投票:0回答:1

我使用下面的方法在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
)

如你所见,它总是生成长度为40的RAW数据。 enter image description here

我需要长度为 RAW(8) 而不是 RAW(40) 的哈希值。有没有现成的方法可以做到这一点? 如果没有,有没有办法使用 DBMS_CRYPTO 生成长度为 RAW(8) 的哈希?

sql oracle hash dbms-crypto
1个回答
0
投票

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

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.