Java 为客户创建唯一但已订购的订单号';s指令

Java 为客户创建唯一但已订购的订单号';s指令,java,unique,Java,Unique,在我的java应用程序中,我需要为客户订单生成一个唯一订单号。我认为创建订单的时间是一个足够好的唯一值。不能在同一秒创建两个订单。 为了防止其他人使用ordernumber,通过猜测某个creationtime值,我将creationtime字符串的哈希的一部分附加到它,并将其作为最终的ordernumber字符串 这种方法是否存在任何看不见的缺陷?根据创建时间创建订单号旨在为系统中创建的订单提供某种排序顺序。。 这里给出了代码 public static String createOrderN

在我的
java
应用程序中,我需要为
客户订单
生成一个
唯一订单号
。我认为
创建订单的时间
是一个足够好的唯一值。
不能在同一秒创建两个订单
。 为了防止其他人使用ordernumber,通过猜测某个creationtime值,我将creationtime字符串的
哈希
的一部分附加到它,并将其作为最终的ordernumber字符串

这种方法是否存在任何看不见的缺陷?根据创建时间创建订单号旨在为系统中创建的订单提供某种排序顺序。。 这里给出了代码

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中同时执行,那么将生成相同的命令

如果不是这样的话,我觉得基于日期生成唯一订单号没问题。 我真的不明白散列的意思。 我的意思是,从密码学的角度来看,它并没有真正为代码增加安全性。如果“恶意”客户机猜测订单号,就足以知道应用了SHA1散列,算法本身是已知的,并且可以用于确定订单号


希望这对您有所帮助

如果需要,唯一订单应始终来自通用的第三方系统,并且接收/计算方法应通过同步方法进行,在同步方法中,这将按顺序进行,或者可以通过几乎始终唯一的数据库系统生成。

“不能同时创建两个订单”如果服务器每秒处理20个订单,它们就可以。如果你只需要使用一个整数并将其递增,那么代码和转换就会非常多。。。。orderNo++有什么问题?如果应用程序在中运行,则在creationtime字符串中添加修改后的用户电子邮件地址(如user1 gmail com)可能会创建一个唯一的订单号clusters@jimgardener,这样做的可能性较小,但并非不可能。您可以将毫秒添加到创建时间。但是,应该有一个中央存储(例如数据库),您可以检查id是否唯一。i、 你打算怎么处理这个身份证?为什么它需要是唯一的呢?我想,一个唯一的订单号将需要与btw shopadmin和客户进行沟通