Как реализовать ora_hash (посеянный хеш, который делит любой тип данных sql на n сегментов)

Я посмотрел статью в Википедии о хэш-таблицах, но, похоже, ничего не говорится о том, как реализовать хеш-таблицу, которая может равномерно распределять записи произвольного типа данных SQL по n сегментам.

Кто-нибудь может указать мне направление документации или существующего исходного кода на эту тему?

1 ответ

Решение

Я полагаю, вы говорите об идеальной хэш-функции. Функция Oracle ORA_HASH не является идеальной хеш-функцией.

http://en.wikipedia.org/wiki/Perfect_hash_function

Как можно ближе к тому, что вы, кажется, хотите, это ассоциативный массив. У Oracle есть те. Начните играть с этим примером:

set serverout on size 10000
DECLARE
cursor foo 
is 
  select distinct fld1,fld2,fld9  from sometable;

type t is table of foo.%ROWTYPE
  index by varchar2;   -- change the index to an int if you want

myarray t; -- myarray is a table of records -- whatever foo returns

BEGIN
  for x in foo
  loop
      -- index using the first column of the fetched row  "fld1":
      myarray(x.fld1)=x;  -- assign the rowtype to the table of records.      
  end loop;

END;
/  

Примечание: ассоциативный массив построен на хеш-таблице, в приведенном выше примере в качестве хеш-ключа используется fld1. Таким образом, вышеприведенное будет работать только в том случае, если, как вы описываете, идеальное хеширование, если и только если fld1 является уникальным полем. Это то, что нужно делать отличному. Это не всегда требуется.

Другие вопросы по тегам