Я не хочу, чтобы идентификатор моей базы данных был последовательным, поэтому я пытаюсь создать uids с помощью этого кода:
$bin = openssl_random_pseudo_bytes(12); $hex = bin2hex($bin); return base_convert($hex, 16, 36);
Мой вопрос: сколько байтов мне нужно будет сделать идентификаторы достаточно уникальными, чтобы обрабатывать большие объемы записей (например, твиттер)?
Вы можете подумать над тем, как работают tinyurl и другие услуги сокращения. Я использовал аналогичные методы, которые гарантируют уникальность до тех пор, пока все комбинации не будут исчерпаны. Таким образом, в основном вы выбираете алфавит и сколько символов вы хотите в качестве длины. Предположим, мы используем буквенно-цифровые, верхние и нижние, так что это 62 символа в алфавите, и давайте сделаем 5 символов в коде. Это 62 ^ 5 = 916,132,832 комбинаций.
Вы начинаете с вашего идентификатора последовательной базы данных, и вы умножаете его на некоторое простое число (выберите один из них довольно большой, например, 2097593). Все, что вы делаете, умножается на ваш идентификатор базы данных, удостоверяясь, что обернется, если вы превысите 62 ^ 5, а затем преобразуете это число в base-62 согласно выбранному вами алфавиту.
Это делает каждый код довольно уникальным, но поскольку мы используем простое число, нам гарантировано не ударить тот же номер дважды, пока мы не будем использовать все коды уже. И это очень коротко.
Вы можете использовать более длинные клавиши с меньшим алфавитом, если длина не является проблемой.
Вот вопрос, который я задал по тем же строкам: уникальный код типа Tinyurl: потенциальный алгоритм предотвращения столкновений
Используйте uniqid()
PHP с добавленным коэффициентом энтропии. Это даст вам много места.
Предполагая, что openssl_random_pseudo_bytes
может генерировать все возможные значения, N байтов даст вам 2 ^ (N * 8)
разные значения. Для 12 байтов это 7.923 * 10^28
использовать MySQL UUID
insert into `database`(`unique`,`data`) values(UUID(),'Test');
Если вы не используете MySQL для поиска google для UUID (имя базы данных), и это даст вам возможность
Источник: Википедия
Другими словами, только после генерации 1 миллиарда UUID каждую секунду в течение следующих 100 лет вероятность создания только одного дубликата будет составлять около 50%