PL/SQL中是否有哈希函数?

15

我正在寻找一种在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拥有。 - tbone
2个回答

24

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

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

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

如果您需要加密安全的哈希函数,我不建议使用此函数。但是,如果您只是需要一个简单的哈希函数,这个函数应该足够使用。


我已经尝试过那个函数了,但它不是我要找的,问题是由于权限问题我无法访问该库。 - jomaora
3
很遗憾,虽然SQL中有内置函数ORA_HASH,但在PL/SQL中却没有。如果我们想在PL/SQL中调用它(至少在Oracle 10g中),就需要使用类似于SELECT ORA_HASH(DATA) INTO variable FROM DUAL这样的语句。 - Sanders the Softwarer
是的...但比我想象的更有趣。我正在寻找一个哈希函数来测试去重的想法。在那个问题中,我使用了CLOB的ORA_HASH重载。在阅读了您的评论后,我尝试在“普通”字符串上运行,确实每次都得到相同的值。所以这里发生了什么:连续运行select ORA_HASH('X', 10000, 0)几次,你会得到相同的值。然而,连续运行select ORA_HASH(to_clob('X'), 10000, 0)几次 - 每次都得到不同的值。这真的很奇怪,甚至比我想象的还要糟糕。 - user5683823
@JustinCave - 我刚刚在谷歌上搜索了“ORA_HASH on clob”,看起来这个轮子已经被多次发明和重新发明了许多次。 - user5683823
1
仔细查看文档后发现:对于 Oracle 10.1,它们说:“expr 表示的数据类型或长度没有限制。”11.1 版本的文档也是完全一样的,但接着立即补充道:“expr 不能是 LONGLOB 类型。” - user5683823
显示剩余2条评论

16
在Oracle 12c中,您可以使用函数STANDARD_HASH
在 Oracle 11g 及以下版本中,请确保您连接的用户拥有适当的权限。与您的 DBA 谈论添加 SYS.DBMS_CRYPTO 包上的执行权限。
Oracle 提供了一个很好的 指南,介绍如何使用 Oracle 数据库处理哈希和加密数据。
如果您使用的是不支持 DBMS_CRYPTO 的旧版数据库,您也可以尝试使用 DBMS_OBFUSCATION_TOOLKIT。

嗨,是的,实际上那就是问题所在,架构师没有给我权限,谢谢! - jomaora

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接