Поэтому я немного покопался и пытался собрать воедино функцию, которая генерирует действительный UUID v4 в PHP. Это самое близкое, что мне удалось приехать. Мои знания в шестнадцатеричном, десятичном, двоичном, побитовых операторах PHP и тому подобном практически не существуют. Эта функция генерирует действительный UUID v4 вплоть до одной области. UUID версии 4 должен иметь вид:
xxxxxxxx-xxxx- 4 xxx- y xxx-xxxxxxxxxxxx
где y равно 8, 9, A или B. Это то место, где функции не работают, так как он не придерживается этого.
Я надеялся, что кто-то, обладающий большими знаниями в этой области, чем я, сможет протянуть мне руку и помочь мне исправить эту функцию, чтобы она соответствовала этому правилу.
Функция выглядит следующим образом:
<?php
function gen_uuid() {
$uuid = array(
'time_low' => 0,
'time_mid' => 0,
'time_hi' => 0,
'clock_seq_hi' => 0,
'clock_seq_low' => 0,
'node' => array()
);
$uuid['time_low'] = mt_rand(0, 0xffff) + (mt_rand(0, 0xffff) << 16);
$uuid['time_mid'] = mt_rand(0, 0xffff);
$uuid['time_hi'] = (4 << 12) | (mt_rand(0, 0x1000));
$uuid['clock_seq_hi'] = (1 << 7) | (mt_rand(0, 128));
$uuid['clock_seq_low'] = mt_rand(0, 255);
for ($i = 0; $i < 6; $i++) {
$uuid['node'][$i] = mt_rand(0, 255);
}
$uuid = sprintf('%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x',
$uuid['time_low'],
$uuid['time_mid'],
$uuid['time_hi'],
$uuid['clock_seq_hi'],
$uuid['clock_seq_low'],
$uuid['node'][0],
$uuid['node'][1],
$uuid['node'][2],
$uuid['node'][3],
$uuid['node'][4],
$uuid['node'][5]
);
return $uuid;
}
?>
Спасибо всем, кто может мне помочь.
$newId = exec('uuidgen -r');
Ответы:
Из этого комментария к руководству по PHP вы можете использовать это:
источник
Вместо того, чтобы разбивать его на отдельные поля, проще создать случайный блок данных и изменить отдельные позиции байтов. Вам также следует использовать лучший генератор случайных чисел, чем mt_rand ().
В соответствии с RFC 4122 - раздел 4.4 вам необходимо изменить следующие поля:
time_hi_and_version
(биты 4-7 7-го октета),clock_seq_hi_and_reserved
(биты 6 и 7 9-го октета)Все остальные 122 бита должны быть достаточно случайными.
Следующий подход генерирует 128 битов случайных данных с использованием
openssl_random_pseudo_bytes()
, делает перестановки на октетах, а затем используетbin2hex()
иvsprintf()
для окончательного форматирования.В PHP 7 генерировать случайные последовательности байтов еще проще, используя
random_bytes()
:источник
$data = file_get_contents('/dev/urandom', NULL, NULL, 0, 16);
$data = $data ?? random_bytes( 16 );
Теперь вы МОЖЕТЕ указать свой собственный источник случайных данных или позволить функции сделать это за вас. :-)Любой, кто использует зависимости композитора , может захотеть рассмотреть эту библиотеку: https://github.com/ramsey/uuid
Это не становится легче, чем это:
источник
в системах Unix используйте системное ядро для генерации UUID для вас.
Кредит Samveen на https://serverfault.com/a/529319/210994
источник
/dev/random
что блокирует, если пул энтропии исчерпан./dev/urandom
, который, по моему пониманию, не исчерпал бы, но рискует вернуть дубликаты uuids. Я думаю, это компромисс; вам действительно нужен уникальный идентификатор под влиянием энтропии системы?В своем поиске создания vuuuid v4 я сначала пришел на эту страницу, а затем нашел ее на http://php.net/manual/en/function.com-create-guid.php
кредит: павел.волинцев
Изменить: чтобы уточнить, эта функция всегда даст вам vuuid v4 (PHP> = 5.3.0).
Когда функция com_create_guid доступна (обычно только в Windows), она использует ее и удаляет фигурные скобки.
Если его нет (Linux), он обратится к этой сильной случайной функции openssl_random_pseudo_bytes, а затем использует vsprintf для форматирования в v4 uuid.
источник
Мой ответ основан на комментарии пользователя uniqid, но он использует функцию openssl_random_pseudo_bytes для генерации случайной строки вместо чтения из
/dev/urandom
источник
Если вы используете,
CakePHP
вы можете использовать их методCakeText::uuid();
из класса CakeText для генерации uuid RFC4122.источник
Небольшое изменение в ответе Джека о добавлении поддержки PHP <7:
источник
Вдохновленный broofa ответ «s здесь .
Или, если вы не можете использовать анонимные функции.
источник
mt_rand()
что не гарантируется случайность.Я искал точно такую же вещь и почти реализовал ее версию, я подумал, что стоит упомянуть, что, если вы делаете это в рамках WordPress , у WP есть своя супер-удобная функция именно для этого:
$myUUID = wp_generate_uuid4();
Вы можете прочитать описание и источник здесь .
источник
false
indeКак насчет использования mysql для генерации uuid для вас?
источник
UUID()
Функция MySQL создает vuuid.источник
От Тома, на http://www.php.net/manual/en/function.uniqid.php
источник
/dev/urandom
должно быть хорошо -/dev/random
следует использовать только для генерации долгосрочных криптографических ключей.mt_rand()
запасного варианта и прибегает к посеву, если нет ничего более изощренного.random_bytes()
в PHP 7 и всеЯ уверен , что есть более элегантный способ сделать преобразование из двоичного в десятичное для
4xxx
иyxxx
частей. Но если вы хотите использовать вopenssl_random_pseudo_bytes
качестве генератора криптографически защищенных номеров, это то, что я использую:источник
Используйте Symfony Polyfill / Uuid.
Тогда вы можете просто сгенерировать uuid как собственную функцию php:
Подробнее об этом читайте в официальном сообщении блога Symfony - https://symfony.com/blog/introduction-the-new-symfony-uuid-polyfill
источник