создание уникального, но заказанного номера заказа для заказа клиента - PullRequest
0 голосов
/ 24 сентября 2011

В моем приложении java мне нужно сгенерировать unique order number для customer's order. Я думал, что time of creation of order - достаточно хорошее уникальное значение. Two orders cannot be created at the same second.Чтобы другие не использовали порядковый номер, угадав некоторое значение времени создания, я добавил к нему часть 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

Ответы [ 2 ]

1 голос
/ 24 сентября 2011

Одна потенциальная проблема может возникнуть, если ваше приложение работает на кластере серверов.В этом случае, если случится так, что этот код выполняется одновременно в двух JVM, будут сгенерированы одинаковые заказы.

Если это не так, генерация уникального номера заказа на основе дат звучит для меня нормально.Я действительно не понял значение хэша здесь.Я имею в виду, что с точки зрения криптографии это не добавляет безопасности вашему коду.Если «злонамеренный» клиент угадывает номер заказа, достаточно знать, что применяется хэш SHA1, сам алгоритм известен и может применяться для определения номера заказа.

Надеюсь, это поможет

0 голосов
/ 05 ноября 2018

Если требуется уникальный, он всегда должен быть из сторонней системы, которая является распространенной, и метод получения / расчета должен быть синхронизированным, где это будет происходить последовательно или может быть сгенерировано через систему базы данных, которая почти всегда будет уникальной.

...