Прежде всего, я бы пошел на автоматическое увеличение. Даже если вы решите использовать код, упомянутый (месяц + случайный материал), я бы посоветовал также использовать числовое число (int/bigint) auto increment id. Вы должны использовать этот идентификатор «под поверхностью», чтобы ваш код связывался с базой данных (ссылаясь/просматривая записи).
Так что для идентификатора «месяц + случайный материал» я бы не советовал ничего использовать с uniqid()
, поскольку он основан на микросекундах и не уникален, если две транзакции будут проходить в тот же микросекунда. Также я бы отказался от использования md5()
, потому что эта функция была бы очень полезна для хэширования, но сильно замедляет ваш код, если вы будете использовать его только для генерации символов.
Также ваше собственное предложение кода генерирует 4 случайных символа, которые могут быть 0-9 или a-f (шестнадцатеричные), что дает вам 16 возможностей. 4 символа из 16 вариантов дают вам 16x16x16x16 = 65 536 уникальных строк. Было бы очень возможно, что при рендеринге 10 000 из этих строк вы получили бы дубликаты.
Я бы посоветовал создать случайную строку из символов 0-9, a-z и A-Z, что дает вам 36 возможностей для каждого символа и с 4 символами дает вам 36x36x36x36 = 1,679,616 уникальных строк. Больше символов дает меньше вероятности дублирования (столкновение). Вы могли бы сделать такие вещи, как это:
function randString($length = 4) {
$randChars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$randString = '';
while (strlen($randString) < abs(intval($length))) {
$randString .= substr($randChars, rand(0, strlen($randChars)-1), 1);
}
return $randString;
}
$id = date('m') . randString(4);
Я также хотел бы оставить в тире («-
») между месяц и случайные символы, потому что это экономит вам 1 символ, и вы знаете, первые два символа всегда будет номер месяца.
Edit: сделать некоторые тесты
Я сделал некоторые испытания на столкновение: я оказал 10000 случайных струне сто раз и проверяется уникальность каждый раз. Делается это с длиной 3, 4 (как вы это делали), 5 и 6. Так вот результаты:
-------- Length 3 ------------
Minimal duplicates: 170
Maximum duplicates: 241
Average duplicates: 207.05
-------- Length 4 ------------
Minimal duplicates: 0
Maximum duplicates: 8
Average duplicates: 3.19
-------- Length 5 ------------
Minimal duplicates: 0
Maximum duplicates: 2
Average duplicates: 0.05
-------- Length 6 ------------
Minimal duplicates: 0
Maximum duplicates: 0
Average duplicates: 0
Absolute 0% вероятность столкновения не может быть исключена, как и указывал Mark B со ссылкой к проблеме дня рождения.
и что после месяца? Я бы префикс его тоже год –
Почему случайный идентификатор вместо «инкрементного числового идентификатора» сбрасывается до 0 в начале каждого месяца? Только с 4 случайными символами (0-9 a-f) риск «столкновения» выглядит относительно высоким. –
Полагаю, год не нужен, потому что было бы очень долго. Бухгалтеру или бухгалтеру необходимо написать его на каждом документе. Таким образом, идентификатор должен быть как можно короче. Если тот же идентификатор будет в 2013 и 2014 годах, я думаю, что это не проблема. Идентификатор необходимо найти в программном обеспечении. Таковы наши требования законодательства. Кто-то видит id в документе и спрашивает бухгалтера: покажите мне, где он записан в программном обеспечении. – user2232696