生成唯一的参考号

时间:2012-07-19 18:06:20

标签: java database oracle hibernate primary-key

Tech Stack :Java 1.6,JPA(Hibernate 3),Spring 3,Oracle 11g

我正在开展一个项目,其中一项要求是向客户回馈'ReferenceNumber'。

一种选择是返回行ID,但为了使其起作用,它必须不是顺序的。否则,您可以猜出下一个号码等。

我可以在Java中生成一个数字并将其存储在一个单独的列中,但是我会确保没有冲突。

有很多方法可以在数据库中生成这样的数字,但不确定它是否能保证唯一性。

从数据库的角度来看,这种要求是否有最佳实践?

更新1

目前我在Java中使用以下内容来生成数字:

    private static SecureRandom random = new SecureRandom();

    public static BigInteger getNew() {
        return new BigInteger(60, random);
    }

    public static BigInteger getNew(int numBits) {
        return new BigInteger(numBits, random);
    }

更新2:要求

允许序号允许:

  1. 客户猜猜下一个号码。
  2. 找出两个号码之间有多少个号码(订单)。等
  3. 这个引用最好是一个数字,但是用数字表示的三个字母前缀也可以。

3 个答案:

答案 0 :(得分:2)

如果您的表具有序列生成的主键(例如customer_id),那么您可以反转数字,然后将其转换为八进制表示。因此它仍然看起来像一个十进制数字,但它肯定不再连续,很难猜测任何范围。

如果你能找到一种如何在原始值中处理尾随零的方法,那么这个过程甚至是可逆的(因为它们在反转的数字中成为前导零,因此在转换过程中会被“丢弃”)。

答案 1 :(得分:1)

如何使用客户缩写或名称缩写或其他内容(或在创建客户时分配3个字母,检查唯一性)为数字添加前缀,然后只存储一个值,以便为该客户按顺序递增?这样他们就无法分辨出系统其他部分的订单号是什么,但他们可以为自己制造,这应该不重要,因为他们知道他们已经下了多少订单。

答案 2 :(得分:0)

为什么不采用几个相关字段的SHA1或MD5哈希(比如用户的名字和创建记录的时间等)?在许多方面,如果策略众所周知,那么数据库外部的服务将能够重新创建引用号,而无需查询数据库。