Как создать новый GUID?

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

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

Есть идеи?

Ответы

Ответ 1

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

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

Ответ 2

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

$guid = bin2hex(openssl_random_pseudo_bytes(16));

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

Ответ 3

<?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

Ответ 4

В соответствии с различием между 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

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

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

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

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

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

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

Ответ 5

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

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

Ответ 6

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

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

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

Если два идентификатора генерируются с более короткими интервалами, это приведет к созданию идентификатора, который с вероятностью 99,99999999999999999% будет глобально уникальным (коллизия в 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 здесь