Oracle ORA_哈希的替代品?

Oracle ORA_哈希的替代品?,oracle,hash,oracle11g,checksum,Oracle,Hash,Oracle11g,Checksum,我们正在使用第三方数据库中的一个表,该表没有主键,但有唯一索引 因此,我一直在考虑使用ORA_散列函数通过在unique索引中传递列的值来生成事实上的唯一Id 不幸的是,我已经看到我们有一些冲突,这意味着我们无法使用此方法导出唯一的id 有没有替代ORA_散列的方法为唯一输入提供唯一id 我想我可以使用DBMS_CRYPTO.Hash生成一个Id,但理想情况下我希望得到一个数值 编辑 更复杂的是,我需要将这些记录存储在另一个(SQL Server)数据库中,然后比较原始表和副本表中的记录。因此,

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

因此,我一直在考虑使用ORA_散列函数通过在unique索引中传递列的值来生成事实上的唯一Id

不幸的是,我已经看到我们有一些冲突,这意味着我们无法使用此方法导出唯一的id

有没有替代ORA_散列的方法为唯一输入提供唯一id

我想我可以使用DBMS_CRYPTO.Hash生成一个Id,但理想情况下我希望得到一个数值

编辑

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

您尝试过:

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

DBMS_CRYPTO.HASH可用于生成高位散列(足够高,使冲突发生的几率非常低,但不是零),但它返回的是“原始”而不是“数字”

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

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


您必须定期更新映射表,以考虑插入的行,这将是一件痛苦的事情,但它可以让您生成自己的PK并跟踪它们,而不会带来很多麻烦。

为什么不直接使用
rank
?@mureinik-我添加了一条解释性注释。不幸的是,这将限制在24-25位左右。所以,即使是很小的表(10000行),也几乎可以保证会发生冲突。谢谢,Matthew。这帮了大忙。