У меня есть системное требование для генерации строки из 11 символов, где должно быть уникально 8 самых правых символов.Тест на столкновение с уникальным номером Java не исчерпывается
Теперь из моего понимания, самое большее это происходит несколько сотен раз в день. Из-за проблем с скоростью меня попросили не использовать DB, чтобы просто получить nextval() в последовательности, к сожалению.
Итак, я остался, чтобы проверить различные способы генерации случайного числа как можно лучше, и я придумал решение, основанное на классе SecureRandom.
Я решил проверить его, чтобы увидеть, насколько вероятно, что сгенерированная строка повторится сама; Я тестировал с помощью HashMap (строка, строка) для 10 миллионов поколений - отлично смотрел и надеялся протестировать ночь на миллиард случайных строк, но это произошло из-за исключения в потоке «main» java.lang.OutOfMemoryError: Java куча пространство
тест код, который я до сих пор это:
public class Main {
public static BigInteger BASE = BigInteger.valueOf(62);
public static final String DIGITS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
public static void main(String[] args) {
// TODO Auto-generated method stub
long lStartTime = System.nanoTime();
HashMap<String, String> orders = new HashMap<String, String>();
for (int i = 0; i < 960000000; i++) {
SecureRandom randObj = new SecureRandom();
BigInteger BigRand = new BigInteger(128, randObj);
String rand = BigRand.toString(62);
StringBuilder result = new StringBuilder();
while (BigRand.compareTo(BigInteger.ZERO) == 1 && result.length()<11) { // number > 0
BigInteger[] divmod = BigRand.divideAndRemainder(BASE);
BigRand = divmod[0];
int digit = divmod[1].intValue();
result.insert(0, DIGITS.charAt(digit));
}
String doesKeyExistString = orders.get(result);
if (doesKeyExistString != null) {
System.out.print("Duplicate key found!: "+result.toString()+"\n");
} else {
orders.put(result.toString(), result.toString()); // No such key
}
}
long lEndTime = System.nanoTime();
long difference1 = lEndTime - lStartTime;
double difference = (double)difference1/1000000000;
System.out.println("Elapsed seconds: " + difference);
System.out.println("Elapsed exact: " + difference1);
}
есть ли у вас какой-либо предложения, как доказать, что мы можем полагаться на этом методе генерации случайных чисел, с вероятностью получения тех же строк вдвое меньше?
я наткнулся на этот вопрос: random number generator test Ответ выглядит интересно, но я не совсем понимаю, как применить это к моему делу (статистика была моя трудная, конечно, я едва прошел его вторую попытку ...)
Я также не уверен, как настроить этот генератор случайных чисел, чтобы динамически установить длину генерируемого числа .. там должен быть лучший способ сделать это, чем то, что я здесь ...
Спасибо!
Миллиард раз 11 символов раз 2 байта составляет 22 ГБ без учета объектных или хэш-таблиц. Вы действительно можете себе это позволить только для этой тривиальной функции? У тебя есть это? И как может быть какая-то проблема скорости в отношении чего-то, что происходит только несколько сотен раз в день? Кто-то тратит впустую ваше время. – EJP
Сколько уникального 11-символа вам нужно за единицу времени? Поскольку обратный unixtime может быть хорошим генератором в вашем случае –
Если у вас есть дисковое пространство, вы можете использовать базу данных для хранения сгенерированного элемента d (для вашего теста) –