首页 > 解决方案 > 如何确定 oracle standard_hash 函数的输出长度?

问题描述

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

我有下表

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**)
);

(该表有 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 列存储表中每一行的哈希值。这是否意味着我最初通过放置 Raw ( 1000 ) 创建表 tbl1 时从标准哈希中高估了哈希值的输出长度的大小?

提前致谢!

标签: oraclehash

解决方案


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

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)。


推荐阅读