gpt4 book ai didi

java - 为客户的订单创建唯一但已订购的订单号

转载 作者:行者123 更新时间:2023-12-01 15:43:49 25 4
gpt4 key购买 nike

在我的java应用程序中,我需要为客户订单生成唯一订单号。我认为创建时间订单数量是一个足够好的唯一值。不能同时创建两个订单。为了防止其他人使用订单号,通过猜测一些创建时间值,我在其中附加了创建时间字符串的一部分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

最佳答案

如果您的应用程序在服务器集群上运行,则会出现一个潜在问题。在这种情况下,如果碰巧该代码在两个 JVM 中同时执行,则会生成相同的命令。

如果情况并非如此,那么基于日期的唯一订单号生成对我来说听起来不错。我不太明白这里hash的含义。我的意思是,从密码学的角度来看,它并没有真正为您的代码添加安全性。如果“恶意”客户端猜测了订单号,则足以知道应用了 SHA1 哈希,算法本身是已知的,并且可以应用来确定订单号。

希望这有帮助

关于java - 为客户的订单创建唯一但已订购的订单号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7537174/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com