сколько уникальных идентификаторов может быть сгенерировано - PullRequest
1 голос
/ 25 ноября 2010

Я использую приведенный ниже код для создания уникального идентификатора, который состоит из 8 символов (включая цифровые и буквенно-цифровые символы).

try {
            List<String> uuidList = new ArrayList<String>();
            int counter = 1;
            File file = new File("D://temp//temp1.txt");
            file.createNewFile();

            Writer writer = new FileWriter(file);
            BufferedWriter wr = new  BufferedWriter(writer);
            while(true) {
                int length = bitsArray.length;
                Random r = new Random();
                StringBuffer uuid = new StringBuffer();
                for(int i= 0; i < 8; i++) {
                    int nextRandomId = r.nextInt(length);
                    uuid.append(bitsArray[nextRandomId]);
                }
                String uuidString = uuid.toString();
                wr.write(uuidString);
                wr.newLine();
                if(counter != 1 && uuidList.contains(uuidString)) {
                    Thread.sleep(1000);
                    System.err.println(counter);
                    break;
                }
                //061e735145fc
                System.err.println(uuidString);
                uuidList.add(uuidString);
                counter++;
            }
        } catch (Exception e) {

        }

Мне нужно знать, если я использую приведенный выше код ... то сколько уникальных идентификаторов я могу сгенерировать.Дано

static String[] bitsArray = {"a","b","c","d","e","f","g","h","i",
                          "j","k","l","m","n","o","p","q","r",
                          "s","t","u","v","w","x","y","z",
                          "0","1","2","3","4","5","6","7","8","9"};

Пожалуйста, помогите ..

Ответы [ 6 ]

8 голосов
/ 25 ноября 2010

По сути, вы можете генерировать 36 8 всего строк.

Эта теорема объясняется с помощью Дискретная математика (с использованиемБитовая строка):

У вас есть битовая строка из 8 символов, и вам нужно заполнить, выберите 1 из 36 символов:

__  __  __  __  __  __  __  __  
36  36  36  36  36  36  36  36  (characters a -- z, 0-- 9)

Поэтому у вас есть 36*36*36*36*36*36*36*36 = 36 8 = 2,821,109,907,456 Всего идентификаторов.

2 голосов
/ 25 ноября 2010

Сколько уникальных идентификаторов? Около миллиона. Это зависит от качества используемого вами генератора случайных чисел. Если этот генератор случайных чисел всегда возвращает 4 , вы можете сгенерировать только один идентификатор. Если это некачественный линейный конгруэнтный генератор (который имеет довольно плохую случайность для младших битов), вы можете получить в 256 раз меньше значений, чем теоретический максимум (который составляет 36 8 = около 2800 миллиардов). Однако, поскольку каждый сгенерированный вами идентификатор должен прочитать весь список ранее созданных идентификаторов, я подозреваю, что ваш компьютер просто избавится от страданий, прежде чем достигнет миллиона идентификаторов.

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

2 голосов
/ 25 ноября 2010

Взгляните сюда:

Секция Permutations with Repetition.Теоретически, учитывая набор n элементов (то есть длину вашей bitsArray) и длину перестановки (т.е. вашей uuidString строки), равную r, вы сможете генерировать n ^ r уникальных перестановок(т.е. UUID в вашем случае).

В вашем случае n = 36 (26 букв и 10 цифр) и r = 8 (длина uuid равна 8), поэтому это:

36^8 = 2821109907456
2 голосов
/ 25 ноября 2010

(26 + 10) ^ 8 = 2 821 109 907 456

0 голосов
/ 25 ноября 2010

длина массива равна 36. И вы используете метод r.nextInt(length), это означает, что максимальное значение случайного числа составляет 36, от 0 до 35. Таким образом, вы можете получить максимум 8 индексов 36.

0 голосов
/ 25 ноября 2010

[number of possible char]^[lenght of the generatet id] - очень простая математика

в вашем случае:

36^8 = 2821109907456

...