Tech Stack :Java 1.6,JPA(Hibernate 3),Spring 3,Oracle 11g
我正在开展一个项目,其中一项要求是向客户回馈'ReferenceNumber'。
一种选择是返回行ID,但为了使其起作用,它必须不是顺序的。否则,您可以猜出下一个号码等。
我可以在Java中生成一个数字并将其存储在一个单独的列中,但是我会确保没有冲突。
有很多方法可以在数据库中生成这样的数字,但不确定它是否能保证唯一性。
从数据库的角度来看,这种要求是否有最佳实践?
目前我在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);
}
允许序号允许:
这个引用最好是一个数字,但是用数字表示的三个字母前缀也可以。
答案 0 :(得分:2)
如果您的表具有序列生成的主键(例如customer_id),那么您可以反转数字,然后将其转换为八进制表示。因此它仍然看起来像一个十进制数字,但它肯定不再连续,很难猜测任何范围。
如果你能找到一种如何在原始值中处理尾随零的方法,那么这个过程甚至是可逆的(因为它们在反转的数字中成为前导零,因此在转换过程中会被“丢弃”)。
答案 1 :(得分:1)
如何使用客户缩写或名称缩写或其他内容(或在创建客户时分配3个字母,检查唯一性)为数字添加前缀,然后只存储一个值,以便为该客户按顺序递增?这样他们就无法分辨出系统其他部分的订单号是什么,但他们可以为自己制造,这应该不重要,因为他们知道他们已经下了多少订单。
答案 2 :(得分:0)
为什么不采用几个相关字段的SHA1或MD5哈希(比如用户的名字和创建记录的时间等)?在许多方面,如果策略众所周知,那么数据库外部的服务将能够重新创建引用号,而无需查询数据库。