如何确定 oracle standard_hash 函数输出的长度?

how to determine the length of the output from oracle standard_hash function?

请问如何确定oracle standard_hash函数输出的大小?

我关注table

Create table Tbl1 (
ID number,
Col_1 Varchar2(3000),
Col_2 Varchar2(3000),
Col_3 Varchar2(3000),
Col_30 Varchar2(3000),
Std_hash raw(**1000**)
);

(table 有 30 个 varchar2(3000) 列。我们只是省略了这里的一些列)

以及以下更新语句

update tbl1 set
std_hash = standard_hash (
    ID|| 
    nvl(Col_1 ,'') ||
    nvl(Col_2,'') ||
    nvl(Col_30,'')
);

我尝试使用 max 和 length 函数来确定存储在 std_hash 中的值的最大长度,我得到了 40

select max(length(std_hash)) from tbl1

MAX(LENGTH(STD_HASH))
---------------------
**40**

列STD_Hash存储table中每一行的散列值。这是否意味着我最初在通过放置 Raw (1000) 创建 table tbl1 时高估了标准哈希的哈希值输出长度的大小?

提前致谢!

好吧,这取决于你实际在做什么。

STANDARD_HASH 接受两个参数;您提供了第一个,但没有提供 方法 (哈希算法的名称)。有效值为:

  • SHA1、SHA256、SHA384、SHA512、MD5

默认为 SHA1。

一些测试:

SQL> select
  2    length(standard_hash('x', 'SHA1'))   sha1,
  3    length(standard_hash('x', 'SHA256')) sha256,
  4    length(standard_hash('x', 'SHA384')) sha384,
  5    length(standard_hash('x', 'SHA512')) sha512,
  6    length(standard_hash('x', 'MD5'))    md5
  7  from dual;

      SHA1     SHA256     SHA384     SHA512        MD5
---------- ---------- ---------- ---------- ----------
        40         64         96        128         32

SQL>

由于您没有使用该方法,因此使用了 SHA1,结果的长度为 40 - 您注意到的值。这意味着您可以将列创建为

Std_hash raw(40)

而不是 1000。但是,如果您决定指定另一种方法,则可能需要更改列大小(从 32 到 128)。