替代 ORA_HASH?

Alternative to ORA_HASH?

我们正在使用第 3 方数据库中的 table,它没有主键,但 有唯一索引。

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

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

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

我想我 可以 使用 DBMS_CRYPTO.Hash 生成一个 ID,但理想情况下我想获得一个数值。

编辑

增加的复杂性是我需要将这些记录存储在另一个(SQL 服务器)数据库中,然后比较原始记录和副本 table 的记录。所以 rank 在这里对我没有帮助,因为可以在原始 table.

中添加或删除记录

你试过了吗:

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

DBMS_CRYPTO.HASH 可用于生成高位散列(高到足以给你一个非常低但不是零的冲突机会),但它 returns 'RAW' 不是 'NUMBER'.

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

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

您必须定期更新映射 table,以说明插入的行,这会很痛苦,但它可以让您生成自己的 PK 并跟踪它们而不需要太多并发症。