如何确定oracle标准_散列函数输出的长度?

如何确定oracle标准_散列函数输出的长度?,oracle,hash,Oracle,Hash,请问如何确定oracle标准_散列函数输出的大小 我有下表 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 =

请问如何确定oracle标准_散列函数输出的大小

我有下表

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_散列中存储的值的最大长度,结果得到了40

select max(length(std_hash)) from tbl1

MAX(LENGTH(STD_HASH))
---------------------
**40**
列STD_Hash存储表中每行的哈希值。这是否意味着在通过放置Raw(1000)创建表tbl1时,我最初高估了标准哈希值的输出长度的大小


提前谢谢

这取决于你实际上在做什么

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

  • SHA1、SH256、SH384、SH512、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)。

这取决于您实际执行的操作

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

  • SHA1、SH256、SH384、SH512、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)。

Hi@Littlefoot。谢谢!是的,我只使用默认选项。还有一个问题,我的高估会让我损失很多空间吗?比如说,如果我指定Raw(1000),这是否意味着数据库将分配Raw(1000)所需的空间(如CHAR数据类型)或它仍然是variant(如Varchar2数据类型)?谢谢不客气。正如文档()所说,“RAW是一种可变长度的数据类型,类似于VARCHAR2字符数据类型”。感谢您的帮助!你帮助我解决了我的问题嗨,小脚丫。谢谢!是的,我只使用默认选项。还有一个问题,我的高估会让我损失很多空间吗?比如说,如果我指定Raw(1000),这是否意味着数据库将分配Raw(1000)所需的空间(如CHAR数据类型)或它仍然是variant(如Varchar2数据类型)?谢谢不客气。正如文档()所说,“RAW是一种可变长度的数据类型,类似于VARCHAR2字符数据类型”。感谢您的帮助!你帮助我解决了我的问题