如何实现 ora_hash(将任何 sql 数据类型划分为 n 个桶的可种子哈希)
Posted
技术标签:
【中文标题】如何实现 ora_hash(将任何 sql 数据类型划分为 n 个桶的可种子哈希)【英文标题】:How to implement ora_hash (seedable hash that divides any sql datatype into n buckets) 【发布时间】:2014-06-23 22:43:10 【问题描述】:我查看了关于哈希表的***文章,但它似乎没有说明如何实现一个哈希表,该哈希表可以将任意 SQL 数据类型的条目均匀地分配到 n 个存储桶中。
谁能指点我有关该主题的文档或现有源代码的方向?
【问题讨论】:
您是在问一般如何实现散列函数?ora_hash
哈希函数具体是如何实现的?如何构建哈希表(使用哈希函数的数据结构)?或者只是如何在 SQL 查询中将数据分成桶?
ora_hash 函数具体是如何实现的,最好是某种伪代码/代码,但抽象描述也可以
我不相信 Oracle 曾经记录过他们使用的算法。它与dbms_utility.get_hash_value
使用的算法相同,但我不相信他们在那里记录了内部算法。
您是否知道任何类似的文档实现,或者了解如何实现此类哈希的起点?
ora_hash
也没有。目标是均匀分布。但这不是保证。但是,如果您传递了足够多的不同值,那么任何模糊合理的散列算法都应该允许您将数据基本上均匀地分布在 n 个存储桶中。
【参考方案1】:
我相信你在谈论一个完美的哈希函数。 Oracle 的 ORA_HASH 函数并不是一个完美的哈希函数。
http://en.wikipedia.org/wiki/Perfect_hash_function
尽可能接近您想要的是一个关联数组。甲骨文有这些。 开始玩这个例子:
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 是唯一字段时,上述内容才有效。这就是那里的独特之处。它从来都不是必需的。
【讨论】:
以上是关于如何实现 ora_hash(将任何 sql 数据类型划分为 n 个桶的可种子哈希)的主要内容,如果未能解决你的问题,请参考以下文章
hibernate 中的ORM是如何与数据库实现存储和查询的