【问题标题】:Is there any hash function in PL/SQL?PL/SQL 中有散列函数吗?
【发布时间】:2011-08-01 12:47:35
【问题描述】:

我正在寻找 PL/SQL 中的哈希函数,以获取 varchar 的哈希值。我在 Oracle 10 中找到了一个名为 dbms_crypto 的包,其中包含一个函数 dbms_crypto.hash 甚至其他包 dbms_sqlhash.getHash,但是在我调用它们的地方,我收到一条消息,好像它找不到它们......

有人知道我怎么称呼他们吗?有没有其他的包?

这是我的代码

DECLARE
 l_textToHash VARCHAR2(19) := 'toto123';
 l_ccn_raw RAW(128) := utl_raw.cast_to_raw(l_textToHash);
 l_encrypted_raw RAW(2048);
BEGIN
  dbms_output.put_line('CC:  ' || l_ccn_raw);
  l_encrypted_raw := dbms_crypto.hash(l_ccn_raw, 3);
  dbms_output.put_line('SH1: ' || l_encrypted_raw);
END;
/

这是消息

Error starting at line 1 in command:
DECLARE
 l_textToHash VARCHAR2(19) := 'toto123';
 l_ccn_raw RAW(128) := utl_raw.cast_to_raw(l_textToHash);
 l_encrypted_raw RAW(2048);
BEGIN
  dbms_output.put_line('CC:  ' || l_ccn_raw);
  l_encrypted_raw := dbms_crypto.hash(l_ccn_raw, 3);
  dbms_output.put_line('SH1: ' || l_encrypted_raw);
END;
Error report:
ORA-06550: line 7, column 22:
PLS-00201: identifier 'DBMS_CRYPTO' must be declared
ORA-06550: line 7, column 3:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

谢谢!

【问题讨论】:

  • 你能描述一下吗?: desc dbms_crypto;将归 SYS 所有

标签: oracle hash plsql oracle-sqldeveloper


【解决方案1】:

根据您尝试生成哈希的原因,内置函数 ORA_HASH 可能就足够了,

SQL> select ora_hash( 'fuzzy bunny' ) from dual;

ORA_HASH('FUZZYBUNNY')
----------------------
            2519249214

如果您需要加密安全的哈希函数,我不会尝试使用它。但如果你只需要一个简单的哈希,这就足够了。

【讨论】:

  • 这个功能我已经试过了;但这不是我要找的,问题是由于权限,我没有访问图书馆。
  • 不幸的是,内置函数 ORA_HASH 可用于 SQL 但不适用于 PL/SQL。如果我们希望从 PL/SQL 调用它,则需要使用 SELECT ORA_HASH(DATA) INTO variable FROM DUAL 之类的东西(至少在 Oracle 10g 上)。
  • 据我所知,ORA_HASH 不是正确意义上的hash function;使用完全相同的参数的不同调用返回相同的值。相反,ORA_HASH 似乎随机(且不可重复地)将输入分配给存储桶。
  • @mathguy - 你有测试用例吗?我刚刚重新运行了 6 年前的查询,它今天在与 6 年前不同的数据库中返回了相同的结果。
  • ...并更仔细地查看文档:对于 Oracle 10.1,他们说 expr 表示的数据的类型或长度没有限制。 " 11.1 的文档说的完全相同,但随后立即添加:expr 不能是 LONGLOB 类型
【解决方案2】:

确保您已向正在连接的用户授予适当的权限。与您的 DBA 交谈,为 SYS.DBMS_CRYPTO 包添加执行权限。

Oracle 提供了一个很好的guide,用于使用 oracle 数据库处理散列和加密数据。

如果您使用的是不支持 DBMS_CRYPTO 的旧版本数据库,您也可以尝试 DBMS_OBFUSCATION_TOOLKIT。

在 Oracle 12c 中,您可以使用函数 STANDARD_HASH

【讨论】:

  • 嗨,是的,实际上是这个问题,架构师没有给我权限,谢谢!!
猜你喜欢
  • 2011-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-05
  • 2012-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多