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