在我的java
应用中,我需要为unique order number
生成customer's order
。我认为time of creation of order
是一个足够好的唯一值。Two orders cannot be created at the same second
。
为了防止其他人使用ordernumber,通过猜测一些创建时间值,我将创建时字符串的hash
的一部分附加到它并使其成为最终的订单号字符串。
这种方法有没有看不见的缺陷?根据创建时间创建订单号是为了给系统中创建的订单提供一些排序顺序。 代码在这里给出
public static String createOrderNumber(Date orderDate) throws NoSuchAlgorithmException {
DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
String datestring = df.format(orderDate).toString();
System.out.println("datestring="+datestring);
System.out.println("datestring size="+datestring.length());
String hash = makeHashString(datestring);//creates SHA1 hash of 16 digits
System.out.println("hash="+hash);
System.out.println("hash size="+hash.length());
int datestringlen = datestring.length();
String ordernum = datestring+hash.substring(datestringlen,datestringlen+5);
System.out.println("ordernum size="+ordernum.length());
return ordernum;
}
private static String makeHashString(String plain) throws NoSuchAlgorithmException {
final int MD_PASSWORD_LENGTH = 16;
final String HASH_ALGORITHM = "SHA1";
String hash = null;
try {
MessageDigest md = MessageDigest.getInstance(HASH_ALGORITHM);
md.update(plain.getBytes());
BigInteger hashint = new BigInteger(1, md.digest());
hash = hashint.toString(MD_PASSWORD_LENGTH);
} catch (NoSuchAlgorithmException nsae) {
throw(nsae);
}
return hash;
}
示例输出
datestring=20110924103251
datestring size=14
hash=a9bcd51fc69d9225c5d96061d9c8628137df14e0
hash size=40
ordernum size=19
ordernum=2011092410325125c5d
答案 0 :(得分:1)
如果您的应用程序在服务器群集上运行,则会出现一个潜在问题。 在这种情况下,如果在两个JVM中同时执行此代码,则会生成相同的订单。
如果不是这种情况,基于日期生成的唯一订单号对我来说听起来不错。 我在这里并没有真正理解哈希的含义。 我的意思是从加密的角度来看,它并没有真正为您的代码添加安全性。如果“恶意”客户端猜测订单号,它足以知道应用了SHA1哈希,算法本身是已知的,并且可以应用于确定订单号。
希望这有帮助
答案 1 :(得分:0)
如果需要唯一,则该唯一性应始终来自于常见的第三方系统,并且接收/计算方法应通过同步方法执行,该方法将顺序发生或可以通过几乎总是唯一的数据库系统生成。