Правильный алгоритм PRNG (генератор псевдослучайных чисел) будет иметь время цикла, в течение которого он никогда не будет находиться в такое же состояние. Если вы выставляете все состояние PRNG в количестве, полученном от него, вы получите число, гарантированное уникальным для периода генератора.
Простой ПСЧ, который делает это называется «Linear Congruential» ГСЧ, который перебирает формулу:
X(i) = AX(i-1)|M
Использование правильной пары факторов вы можете получить период 2^30 (примерно 1 миллиард) от простой PRNG с 32-разрядным аккумулятором. Обратите внимание, что вам понадобится временная переменная длиной 64 бит, чтобы удерживать промежуточную «AX» часть вычисления. Большинство, если не все компиляторы C будут поддерживать этот тип данных. Вы также должны иметь возможность делать это с числовым типом данных на большинстве диалектов SQL.
С правильными значениями A и M мы можем получить генератор случайных чисел с хорошими статистическими и геометрическими свойствами. Известная статья об этом написана Фишманом и Муром.
Для получения M = 2^31 - 1 мы можем использовать значения A ниже, чтобы получить PRNG с хорошим длинным периодом (2^30 IIRC).
Хорошие значения A:
742,938,285
950,706,376
1,226,874,159
62,089,911
1,343,714,438
Обратите внимание, что этот тип генератора (по определению) не криптографически безопасный. Если вы знаете последнее число, сгенерированное из него, вы можете предсказать, что он будет делать дальше. К сожалению, я считаю, что вы не можете получить криптографическую безопасность и гарантированную неповторяемость в одно и то же время. Для того, чтобы PRNG был криптографически защищен (например, Blum Blum Shub), он не может выставить достаточное состояние в сгенерированном числе, чтобы можно было предсказать следующее число в последовательности. Поэтому внутреннее состояние шире, чем сгенерированное число, и (для обеспечения хорошей безопасности) период будет длиннее, чем количество возможных значений, которые могут быть сгенерированы. Это означает, что выставленный номер не будет уникальным в течение периода.
По тем же причинам, то же самое относится и к длиннопериодических генераторов, таких как Mersenne Twister.
Мне пришлось до -1, потому что логика этого вопроса ошибочна. – UnkwnTech 2008-11-26 01:58:34
Могли бы добавить, почему вы не хотите использовать простое поле автоинкремента? – staticsan 2008-11-26 02:03:40
Я не могу понять, является ли это случайным или просто уникальным и не последовательным. Я не могу понять, что user_id имеет что-то. И я не понимаю, что такое 9999,999. – 2008-11-26 02:24:20