Oracle 汇编程序开发人员。所以你可能想添加这些标签来吸引观众。虽然我觉得联系这个人比较容易。请让我知道他是否提供了一个关于转换为“unsigned char”数组的答案。虽然你没有完全回答我的问题,但你的答案对这个地位低下的企业开发人员来说是非常令人印象深刻的,也

Oracle 汇编程序开发人员。所以你可能想添加这些标签来吸引观众。虽然我觉得联系这个人比较容易。请让我知道他是否提供了一个关于转换为“unsigned char”数组的答案。虽然你没有完全回答我的问题,但你的答案对这个地位低下的企业开发人员来说是非常令人印象深刻的,也,oracle,algorithm,hash,plsql,database-partitioning,Oracle,Algorithm,Hash,Plsql,Database Partitioning,汇编程序开发人员。所以你可能想添加这些标签来吸引观众。虽然我觉得联系这个人比较容易。请让我知道他是否提供了一个关于转换为“unsigned char”数组的答案。虽然你没有完全回答我的问题,但你的答案对这个地位低下的企业开发人员来说是非常令人印象深刻的,也是朝着正确方向迈出的一大步。非常感谢。 SQL> create or replace function get_ora_hash(i_str in varchar2, i_max_bucket in number default 4294


汇编程序开发人员。所以你可能想添加这些标签来吸引观众。虽然我觉得联系这个人比较容易。请让我知道他是否提供了一个关于转换为“unsigned char”数组的答案。虽然你没有完全回答我的问题,但你的答案对这个地位低下的企业开发人员来说是非常令人印象深刻的,也是朝着正确方向迈出的一大步。非常感谢。
SQL> create or replace function get_ora_hash(i_str in varchar2, i_max_bucket in number default 4294967295, i_seed number default 0)
return number deterministic
parallel_enable
as
  rv number:= 0;
begin

select ORA_HASH(i_str, i_max_bucket, i_seed) 
into rv 
from dual;

return rv;

end;
Function created.
SQL> declare
  l_val number;
begin
  l_val := get_ora_hash('test');
  dbms_output.put_line(l_val);
end;
 PL/SQL procedure successfully completed.
2662839991
SQL> set serveroutput on
SQL> declare
  l_val number;
  l_start_dte timestamp;
  l_end_dte timestamp;
  l_interval INTERVAL DAY(9) TO SECOND(9);
  l_cnt number := 0;
begin
  l_start_dte:= systimestamp;
  --for rec in (select object_name from dba_objects)
  for rec in (select name from my_big_table where rownum <= 1000000)
  loop
    l_cnt := l_cnt + 1;
    l_val := get_ora_hash(rec.name);
  end loop;
  l_end_dte:= systimestamp;
  l_interval := l_end_dte - l_start_dte;
  dbms_output.put_line('Rows processed: ' || l_cnt 
    || ', Start: ' || l_start_dte  
    || ', End: ' || l_end_dte 
    || ', Interval: ' || l_interval);
end;
Rows processed: 1000000, Start: 14-DEC-17 02.48.31.138212 PM, End: 14-DEC-17 02.48.41.148884 PM, Interval: +000000000 00:00:10.010672000
 PL/SQL procedure successfully completed.
select avg(ora_hash(rownum)) id from
(select rownum from dual connect by rownum <= 1e4),
(select rownum from dual connect by rownum <= 1e4);
extern "C" ub4 hash( ub1 *k, ub4 length, ub4 initval)
SQL> select ora_hash(utl_raw.cast_to_raw('0'), power(2, 32) - 1, 0) oh1,
  2         ora_hash('0', power(2, 32) - 1, 0) oh2,
  3         ora_hash(0, power(2, 32) - 1, 0) oh3,
  4         ora_hash(chr(0), power(2, 32) - 1, 0) oh4
  5    from dual;

       OH1        OH2        OH3        OH4
---------- ---------- ---------- ----------
3517341953 3517341953 1475158189 4056412421
int main()
{
    ub1 ta[] = {0};
    ub1* t = ta;
    cout << hash(t, 1, 0) << endl;
    ub1 ta0[] = {'0'};
    ub1* t0 = ta0;
    cout << hash(t0, 1, 0) << endl;
    return 0;
}

1843378377
4052366646
SQL> select dbms_utility.get_hash_value('0', 0 + 1, 1e6 + 1) ha1,
  2         ora_hash('0', 1e6, 0) + 1 ha2
  3    from dual;

       HA1        HA2
---------- ----------
    338437     338437
  function get_hash_value(name varchar2, base number, hash_size number)
    return number is
  begin
    return(icd_hash(name, base, hash_size));
  end;
  function icd_hash(name      varchar2,
                    base      binary_integer,
                    hash_size binary_integer) return binary_integer;
  pragma interface(c, icd_hash);