Как создать случайную строку, используя текущую метку времени в качестве соли в Java?

Я хотел бы создать случайную строку (для вывода на консоль в целях отладки) на основе текущей метки времени.

Например, консоль выдаст:

Setting up browser [123456]...
Getting configuration [758493]...
Completed: [758493].
Completed: [123456].

Здесь 123456 и 758493 - это случайные строки, которые я пытаюсь сгенерировать.

Вот псевдокод того, как я думаю, это может работать:

private String random(int len){
long ts = getCurrentTimestamp;
String value = createRandom(len, ts); 
    //len is the length of the randomString
    //and ts is the salt
return value;
}

Может ли кто-нибудь помочь с подробностями этого (что нужно импортировать) и / или, возможно, предложить улучшения для этого?


person rishimaharaj    schedule 03.07.2012    source источник


Ответы (3)


Ну, это зависит от того, что вы подразумеваете под «текущей меткой времени». Вы можете использовать _1 _, но это не обязательно будет уникальным - если вы вызовете его несколько раз за короткий период, вы вполне можете получить одни и те же результаты несколько раз. Также есть System.nanoTime() .

В качестве альтернативы вы можете использовать UUID.randomUUID() с использованием всех битов или некоторого подмножества. (Если вы решили использовать подмножество, вам следует тщательно выбирать их. Не все биты в UUID равны.)

person Jon Skeet    schedule 03.07.2012
comment
Спасибо, Джон, за ваши предложения! Можете ли вы увидеть мой другой комментарий под ответом @Spaeth, и, пожалуйста, скажите мне, что вы об этом думаете? - person rishimaharaj; 04.07.2012
comment
@rishimaharaj: Это кажется разумным, но я думаю, что лично я бы пошел с UUID. - person Jon Skeet; 04.07.2012

Как насчет MD5 от System.nanoTime()?

MessageDigest instance = MessageDigest.getInstance("MD5");
byte[] messageDigest = instance.digest(String.valueOf(System.nanoTime()).getBytes());
StringBuilder hexString = new StringBuilder();
for (int i = 0; i < messageDigest.length; i++) {
    String hex = Integer.toHexString(0xFF & messageDigest[i]);
    if (hex.length() == 1) {
        // could use a for loop, but we're only dealing with a single
        // byte
        hexString.append('0');
    }
    hexString.append(hex);
}
return hexString.toString();

Результат за 4 вызова:

bbf9123ac9335581535350e863236800
67fef4376523ae683b2e1d54fd97df53
ef1e747dc916584baed73a0921410216
8c8bc839bf739210a3875966430879de
person Francisco Spaeth    schedule 03.07.2012
comment
Мне нравится предложение System.nanoTime. Что вы думаете об этом: Long.toString(System.nanoTime()).substring(9);? - person rishimaharaj; 04.07.2012
comment
System.nanoTime возвращает 16-значное число. substring(9) отрезал первые 9 цифр (которые были одинаковыми и дали мне больше случайных, но разумных оставшихся цифр). С 1145968877460237 и 1145968878065213 до 7460237 и 8065213. - person rishimaharaj; 04.07.2012

Ключ на основе текущей отметки времени:

npm install random-key-generator 
person Hemanth    schedule 04.01.2018
comment
Обратите внимание на тег Java в этом вопросе. - person Jesper N; 10.02.2020