oracle - 如何确定 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 时从标准哈希中高估了哈希值的输出长度的大小?
提前致谢!
解决方案
嗯,这取决于你实际在做什么。
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)。
推荐阅读
- python-3.x - 在 Odoo 记录中发送电子邮件不存在
- ios - 如何在 tableview Swift 中获取选中标记的行列表?
- java - 类实例化多次;如何判断被呼叫的是哪一个?
- python - 确认 URL 不断变化,假设这会导致当前代码出现问题
- javascript - 从类方法调用函数
- git - 詹金斯创建一个工作来构建许多回购
- c++ - vs2005 项目不是从命令行编译,而是在 Visual Studio 中编译
- android - 使用 Firebase Auth 在 Android 上执行 Flutter 项目时出错
- javascript - 如何使用 node.js 在 mysql 中查看存储为 blob 的图像/照片?
- java - 如何接收 RTP 流并提取音频?(爪哇)