oracle使用哈希算法,ORA_HASH函数使用的算法是什么?

本文探讨了Oracle数据库中的ORAHASH函数,通过分析其调用路径和使用示例,揭示了该哈希函数可能涉及的内部C函数,如evaopn2()、evahash()。同时指出,ora_hash在处理不同类型的参数时,可能存在值的转换过程,建议通过安装Oracle Express版本直接调用来模仿ora_hash的功能。还提到了dbms_utility.get_hash_value作为替代方案,并找到了与之相关的_csdhsh函数。
摘要由CSDN通过智能技术生成

Dr Y Wit..

20

另一个似乎使用ORA_HASH的系统

好吧,如果它"似乎在使用",那么进行一些逆向工程并检查究竟是什么调用和反汇编函数代码是有意义的.

但是,如果您想深入了解Oracle内部,那么以下内容可能有所帮助.

首先,您必须弄清楚内部C函数的调用.为此,您可以在一个会话中执行一些长时间运行的代码.我做了这个

select avg(ora_hash(rownum)) id from

(select rownum from dual connect by rownum <= 1e4),

(select rownum from dual connect by rownum <= 1e4);

它也可以是PL/SQL代码,你只需要确保你经常调用ora_hash.

它正在运行

我在Windows上测试过,看起来像ora_hash是......-> evaopn2() - > evahash() - > ...

到目前为止,我们还记得,如果我们将它构建到库(Windows上的DLL)中,我们可以在Oracle中使用外部C函数.

例如,如果我将功能签名更改为我的Win x64

extern "C" ub4 hash( ub1 *k, ub4 length, ub4 initval)

它可以从Oracle成功执行.但是,如您所见,签名与Oracle中的ora_hash略有不同.此函数接受值,其长度和初始值(可能是种子),而Oracle中的签名是ora_hash(expr,max_bucket,seed_value).

我们试着测试一下

Oracle

SQL> select ora_hash(utl_raw.cast_to_raw('0'), power(2, 32) - 1, 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值