Как да генерирам нов 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
проверете stackoverflow.com/questions/2040240/   -  person Damith    schedule 10.02.2014
comment
Доколкото разбирам, new guid() в C# ще върне обект, който връща празен (00000000-0000-0000-000000000000) GUID от конструктора. Тъй като никога не съм виждал C# клас/обект, не знам какви са процедурите за репликиране на подобен клас, за да има същите свойства и методи, които от това, което виждам, изисква уеб услугата. Следователно имам повече нужда да получа PHP еквивалент на C# new guid() метода, за да знам как да го създам. Дано има смисъл?   -  person mauzilla    schedule 10.02.2014
comment
Не преоткривайте колелото, просто използвайте github.com/ramsey/uuid.   -  person localheinz    schedule 01.07.2017


Отговори (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 е внедряването на стандарта UUID от Microsoft.

И така, ето връзка към библиотеки, които ви позволяват да създавате 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. Wikipedia твърди, че

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

За потребители на Google като мен, намирам този фрагмент за по-точен:

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() липсва, това не създава Версия 4 (Произволни) GUID, а само низ от знаци, които изглеждат като 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