Как реализовать 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 является уникальным полем. Это то, что нужно делать отличному. Это не всегда требуется.