Как сгенерировать новый GUID?

Я работаю над веб-службой, для которой требуется новый GUID(), переданный как ссылка на метод внутри службы.

Я не знаком с C# или GUID() object, но требую что-то подобное для PHP (поэтому создайте новый объект, который, насколько я понимаю, возвращает empty/blank GUID).

Любые идеи?


person mauzilla    schedule 10.02.2014    source источник
comment
php.net/manual/en/function.uniqid.php   -  person Realitätsverlust    schedule 10.02.2014
comment
(Примечание: Guid.NewGuid в .NET создает UUIDv4.)   -  person user2864740    schedule 10.02.2014
comment
@YUNOWORK Обычно лучше ссылку нелокализованной исх.   -  person user2864740    schedule 10.02.2014
comment
Аааа дерьмо ... Я только что погуглил и скопировал ссылку, но я автоматически получаю немецкую страницу, извините.   -  person Realitätsverlust    schedule 10.02.2014
comment
Насколько я понимаю, new guid () в C # вернет объект, который возвращает пустой (00000000-0000-0000-000000000000) GUID из конструктора. Поскольку я никогда не видел класса / объекта C #, я не знаю, каковы процедуры для репликации аналогичного класса, чтобы иметь те же свойства и методы, которые из того, что я вижу, требует веб-служба. Следовательно, мне больше нужно получить PHP-эквивалент метода C # new guid (), чтобы знать, как его создать. Надеюсь, это имеет смысл?   -  person mauzilla    schedule 10.02.2014


Ответы (6)


Вы можете попробовать следующее:

function GUID()
{
    if (function_exists('com_create_guid') === true)
    {
        return trim(com_create_guid(), '{}');
    }

    return sprintf('%04X%04X-%04X-%04X-%04X-%04X%04X%04X', mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(16384, 20479), mt_rand(32768, 49151), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535));
}

Источник - com_create_guid

person Michel Ayres    schedule 02.10.2014
comment
@MuhammadNaderi Почему? Проверка function_exists предназначена специально для того, чтобы, если com_create_guid доступен (то есть в Windows), код использует это, но в противном случае он возвращается к sprintf ниже в системах, отличных от Windows, которые все равно должны работать нормально. - person Matt Gibson; 18.10.2016
comment
Насколько мне известно, mt_rand() не обещает уникального значения, поэтому в системах, не основанных на Windows, это может генерировать строку в формате GUID, но это не обещает быть уникальным в глобальном масштабе. - person Muhammad Naderi; 19.10.2016
comment
@MuhammadNaderi Пока это реализует тот же базовый алгоритм, что и функция come_create_guid(), этого достаточно. И вам лучше использовать mt_srand(), чем rand(). Но звонок в mt_srand() может помочь. - person Adam; 19.10.2016
comment
Обратите внимание, что создание uuid с mt_rand() не так уникально, как кажется. Для данного семени результирующий uuid всегда будет одинаковым. Следовательно, вы получите только mt_getrandmax() разных uid - все еще очень большое число, но только крошечную долю уникальности, которую мог бы произвести лучший алгоритм. - person Jerry; 21.08.2020

В качестве альтернативы вышеперечисленным вариантам:

$guid = bin2hex(openssl_random_pseudo_bytes(16));

Это дает строку типа 412ab7489d8b332b17a2ae127058f4eb

person Alexey    schedule 31.07.2017
comment
bin2hex(random_bytes(16)) для PHP7 + - person The Onin; 03.04.2018
comment
GUID не должны быть полностью случайными, они имеют определенную структуру. Не используйте этот ответ, используйте один из других ответов, которые генерируют правильные идентификаторы GUID. - person jlh; 24.06.2019
comment
Какова вероятность наличия нескольких гидов? - person Syafiqur__; 24.03.2021

Согласно Есть ли разница между GUID и UUID ?

GUID - это реализация Microsoft стандарта UUID.

Итак, вот ссылка на библиотеки, которые позволяют вам создавать UUID следующих типов:

  • версия 1 (по времени)
  • версия 3 (на основе имени и хешируется с помощью MD5)
  • версия 4 (случайная)
  • версия 5 (на основе имени и хешируется с помощью SHA1)

https://github.com/search?p=1&q=uuid+php&ref=cmdform&type=Repositories

Я не знаю точно, какой из C # использует, но это, по крайней мере, можно использовать, если вы пишете какое-то программное обеспечение и хотите иметь универсальные уникальные идентификаторы.

Мой предпочтительный выбор был https://github.com/fredriklindberg/class.uuid.php потому что это простой PHP-файл с самым высоким рейтингом (https://github.com/ramsey/uuid) должен был сильно зависеть от других библиотек, но вскоре он может измениться (см. https://github.com/ramsey/uuid/issues/20).

Но если вам действительно нужен GUID (согласно стандарту Microsoft), у них другой процесс генерации, чем у этих 4122. Википедия утверждает, что

GUID и RFC 4122 UUID должны быть идентичны при отображении в текстовом виде.

http://en.wikipedia.org/wiki/Globally_Unique_Identifier#Binary_encoding

В большинстве случаев у вас все будет хорошо, если вы выберете одну из библиотек PHP для UUID. Я не думаю, что вы вмешиваетесь в модель компонентных объектов Microsoft (COM), не так ли?

person SimonSimCity    schedule 10.02.2014
comment
Привет, Саймон, спасибо за ответ. Я могу подтвердить, что для вызова метода soap требуется ссылка на новый Guid () из ASP. Затем служба проверит учетные данные, а затем создаст новый GUID (я думаю, что метод называется new_guid () в объекте Guid (), который затем фиксируется на обоих концах. При этом я не уверен, как подойти к этому как (и Я могу ошибаться), даже если я воссоздаю объект Guid () и отправлю его в качестве ссылки (возможно, через tostring), их служба не сможет работать с объектом PHP (они используют sharepoint). Есть идеи? - person mauzilla; 10.02.2014
comment
Пожалуйста, объясните, почему это было отклонено. Я хочу добиться большего в следующий раз! - person SimonSimCity; 15.11.2016

<?php
function guid(){
if (function_exists('com_create_guid') === true)
    return trim(com_create_guid(), '{}');

$data = openssl_random_pseudo_bytes(16);
$data[6] = chr(ord($data[6]) & 0x0f | 0x40);
$data[8] = chr(ord($data[8]) & 0x3f | 0x80);
return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
}
?>

Генератор GUID

person user8240385    schedule 01.07.2017

Для гуглеров, таких как я, я нашел этот фрагмент более точным:

function getGUID(){
    if (function_exists('com_create_guid')){
        return com_create_guid();
    }else{
        mt_srand((double)microtime()*10000);//optional for php 4.2.0 and up.
        $charid = strtoupper(md5(uniqid(rand(), true)));
        $hyphen = chr(45);// "-"
        $uuid = chr(123)// "{"
            .substr($charid, 0, 8).$hyphen
            .substr($charid, 8, 4).$hyphen
            .substr($charid,12, 4).$hyphen
            .substr($charid,16, 4).$hyphen
            .substr($charid,20,12)
            .chr(125);// "}"
        return $uuid;
    }
}

источник http://guid.us/GUID/PHP

person Muhammad Naderi    schedule 19.10.2016
comment
Не уникальна! Используйте вместо этого: $charid = strtoupper(bin2hex(openssl_random_pseudo_bytes(16))); - person Hamzeh Soboh; 07.02.2017
comment
return vsprintf ('% s% s-% s-% s-% s-% s% s% s', str_split ($ charid, 4)); - person MartinC; 17.06.2017
comment
Если com_create_guid () отсутствует, это не создает GUID версии 4 (случайный), а создает только строку символов, которая выглядит как guid. - person Phil Y; 25.06.2021

Если вам просто нужен уникальный идентификатор:

$uid = dechex( microtime(true) * 1000 ) . bin2hex( random_bytes(8) );

Если идентификаторы генерируются с интервалом более 1 миллисекунды, они на 100% уникальны.

Если два идентификатора генерируются с более короткими интервалами, это приведет к созданию идентификаторов, которые с вероятностью 99,999999999999999999% будут глобально уникальными (коллизия в 1 из 10 ^ 18)

Вы можете увеличить это число, добавив больше цифр, но для генерации 100% уникального идентификатора вам понадобится глобальный счетчик.

если вам действительно нужно соответствие RFC, это будет проходить как действительный GUID версии 4:

$guid = vsprintf('%s%s-%s-4000-8%.3s-%s%s%s0',str_split(dechex( microtime(true) * 1000 ) . bin2hex( random_bytes(8) ),4));

Это следует намерению, но не букве RFC. Среди прочих неточностей это всего лишь несколько случайных цифр. (Добавьте больше случайных цифр, если вам это нужно) Плюс в том, что это быстро по сравнению со 100% совместимым кодом. Вы можете проверить свой GUID здесь

person Simon Rigét    schedule 13.06.2019
comment
второй предоставленный вами метод генерирует недопустимые идентификаторы GUID. Я думаю, что в конце части форматирования есть лишний символ нуля (0). - person spetsnaz; 18.05.2020
comment
Мне кажется, он работает, протестирован на freecodeformat.com: Действителен, UUID - 1722f150-812e-4000-8287-bc4c73c3e8c0, это UUID версии 4. У вас есть пример? - person Simon Rigét; 20.05.2020