我们正在使用第三方数据库中没有主键但 具有唯一索引的表。
因此,我一直在考虑使用ORA_HASH函数通过传入唯一索引中列的值来生成事实上的唯一ID。
不幸的是,我已经看到我们有一些冲突,这意味着我们无法使用此方法派生唯一ID。
是否有替代ORA_HASH可以为唯一输入提供唯一ID?
我想我可以使用DBMS_CRYPTO.Hash 生成一个Id,但我最好还是想得到一个数值。
修改
添加的复杂性是我需要将这些记录存储在另一个(SQL Server)数据库中,然后比较原始表和副本表中的记录。所以rank
对我没有帮助,因为可以在原始表中添加或删除记录。
答案 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;