ORA_HASH的替代品?

时间:2016-10-11 10:52:31

标签: oracle hash oracle11g checksum

我们正在使用第三方数据库中没有主键但 具有唯一索引的表。

因此,我一直在考虑使用ORA_HASH函数通过传入唯一索引中列的值来生成事实上的唯一ID。

不幸的是,我已经看到我们有一些冲突,这意味着我们无法使用此方法派生唯一ID。

是否有替代ORA_HASH可以为唯一输入提供唯一ID?

我想我可以使用DBMS_CRYPTO.Hash 生成一个Id,但我最好还是想得到一个数值。

修改

添加的复杂性是我需要将这些记录存储在另一个(SQL Server)数据库中,然后比较原始表和副本表中的记录。所以rank对我没有帮助,因为可以在原始表中添加或删除记录。

2 个答案:

答案 0 :(得分:3)

DBMS_CRYPTO.HASH可用于生成高位散列(足够高以使您获得非常低但非零的碰撞机会),但它返回'RAW'而不是'NUMBER'。

为了保证不会发生冲突,您需要一对一的哈希函数。据我所知,Oracle没有提供。

一种实用的方法是创建一个新表,将唯一键映射到新生成的主键。例如,唯一值(“ABC”,123,888)映射到838491(使用序列生成838491)。

你必须定期更新映射表,以考虑插入的行,这将是一个痛苦,但它可以让你生成自己的PK并跟踪它们,而不会有太多的复杂性。

答案 1 :(得分:0)

你试过了吗?

DBMS_UTILITY.GET_HASH_VALUE (
   name      VARCHAR2, 
   base      NUMBER, 
   hash_size NUMBER)
  RETURN NUMBER;