Scratch {
private static final SecureRandom secureRandom = new SecureRandom();
public static void main(String[] args) {
Set<String> stringSet = new HashSet<>();
IntConsumer cons = i -> {
String str = System.currentTimeMillis() + ":" + newId("pref");
System.out.println(str);
stringSet.add(str);
int l = 100;
while (l-- > 0);
};
IntStream.range(0, 500).forEach(cons);
System.out.println(stringSet.size());
}
public static String newId(String prefix) {
return (prefix
+ Long.toHexString(System.currentTimeMillis())
+ Integer.toHexString(secureRandom.nextInt(0x10, 0xff))
).toLowerCase();
}
}
получилось следующее - ожидается, что в стринговом сете на выходе я буду иметь 500 строк, но получается 470-480 стабильно. За 1мс на моем ноуте генератор с задержкой вызывается 26 раз. И при диапазоне от 16 до 255 есть 239 значений. Но все равно попадаются одинаковые. я так понимаю, это нормально? И надо увеличивать рандомную часть?
Рандом не обязан не повторять значения. Напротив, хороший рандом повторяет значения. Это только LCG имеет период и гарантию что в течение периода он не повторится (а что там у секьюра, я и не знаю).
Обсуждают сегодня