2012-08-06 81 views
1

我在想,根据我所做的实验,答案是否定的。但是我不确定我是否正确地做着事情。Oracle dbms_utilities.get_hash_value总是为不同的输入返回唯一值吗?

我的功能是:

select buyer_key, DBMS_UTILITY.get_hash_value(buyer_key||'|'||buyer_entity_id||'|'||buyer_io_id||'|'||buyer_line_item_id||'|'||is_billing_enabled||'|'||currency_id_b_trgt||'|'||currency_id_b_prfrd||'|'||ymdh_max,1,POWER(2,16)-1) as hashvalue from network_buyer_dim order by hashvalue asc; 

当我运行它,它会返回与重复hashkey值无数行。但是,当我到数据库并查看这些行(顺便说一下,每个buyer_key都是唯一的)时,我看到这些行不包含相同的值。

我是否正确调用该函数?

+0

文档说的一件事是使用大小为2的幂(您正在使用2减2的幂)。 http://docs.oracle.com/cd/E11882_01/appdev.112/e25788/d_util.htm#autoId33 – Glenn 2012-08-06 21:06:17

+0

我一定错了,因为我的实际代码使用减1 – 2012-08-07 16:36:14

回答

3

显然不是!

hash function器是将可变长度的大 数据集,称为键,以更小的数据集的 固定长度的任何算法或子程序。例如,具有可变长度的人姓名 可以被散列为单个整数。由散列 函数返回的值称为散列值,散列码,散列总和,校验和或简单散列。

这意味着如果输入域集合的大小大于输出域集合的大小,则存在重复。

除此之外,最好的散列函数被认为是那些倾向于为所有可能的输入值给出相同数量的重复输出值的散列函数。

+0

我有一个偷偷摸摸的预感,输入域的大小是输出域大小太大。在发布这个问题之前,我尝试使用2^32-1,但Oracle函数拒绝了这个问题。 – 2012-08-07 16:37:52

相关问题