[PHP8+] Mit einer Funktion eine GUID erzeugen

In PHP suche ich immer wieder die Funktion create_guid, jetzt veröffentliche ich mal eine universelle create_guid Funktion die ich bestens getestet habe:

use Ramsey\Uuid\Uuid;

function create_guid() {
    if (function_exists('com_create_guid')) {
       //Only on Windows 7+ OS
       //Credits to "Thoughtful Tapir" on Grepper
       return trim(com_create_guid(), '{}');
    } elseif (class_exists('Ramsey\Uuid\Uuid')) {
        //Linux/Windows/MacOS: composer require ramsey/uuid
        //Credits on ChatGPT 3.5 (2022)
        //ramsey/uuid is a library from Ben Ramsey MIT license
        $uuid4 = Uuid::uuid4();
        $guid = strtolower($uuid4->toString());
        return $guid;
    } else {
        //OS is not Windows and ramsey/uuid is not installed
        //Try alternate (working) solution
        //Credits to "Pleasant Platypus" on Grepper/php.net as comment
        $guid = '';
        $namespace = rand(11111, 99999);
        $uid = uniqid('', true);
        $data = $namespace;
        $data .= $_SERVER['REQUEST_TIME'];
        $data .= $_SERVER['HTTP_USER_AGENT'];
        $data .= $_SERVER['REMOTE_ADDR'];
        $data .= $_SERVER['REMOTE_PORT'];
        $hash = strtolower(hash('ripemd128', $uid . $guid . md5($data)));
        $guid = $hash;
        return $guid;
    }
}

Diese Funktion gibt einen 32 Byte String GUID zurück, alles in Kleinbuchstaben. Dieser Code ist Größtenteils entweder aus php.net entnommen oder ChatGPT hat mir einige Tipps gegeben, die ich sorgfältig getestet habe.

PS: irgendwann werde ich auch bei ChatGPT einen Code erwischen, den ich geschrieben habe, aber so ist das Leben.
PS2: Ich war schon immer der Meinung Open-Source ist gut, nur leben muss man davon können…

Wer die 36 Bytes Version lieber möchte und Großbuchstaben, dann:

statt:
return trim(com_create_guid(), '{}');
ersetzen mit:
return strtoupper(trim(com_create_guid(), '{}'));

statt:
$guid = strtolower($uuid4->toString());
ersetzen mit:
$guid = strtoupper($uuid4->toString('-'));

statt:
$hash = strtolower(hash('ripemd128', $uid . $guid . md5($data)));
ersetzen mit:
$hash = strtoupper(hash('ripemd128', $uid . $guid . md5($data)));

statt:
        $guid = $hash;
ersetzen mit:
        $guid = substr($hash,  0,  8) . '-' .
                substr($hash,  8,  4) . '-' .
                substr($hash, 12,  4) . '-' .
                substr($hash, 16,  4) . '-' .
                substr($hash, 20, 12);

Getestet unter Ubuntu 22.04 und Windows 10/11

Wie immer, alle Angaben ohne Gewähr, Anwendung auf eigene Gefahr und Verantwortung, ich übernehme keinerlei Haftung für Ausfälle, Datenverlust oder andere finanzielle Schäden.

Ich nehme gerne Ratschläge und Hinweise entgegen, hier als Kommentar oder per Email an office[add]predl.cc!

Jegliche Programmierhilfe (Whatsapp, AnyDesk Fernwartung, Email usw.) nur gegen Einwurf kleiner Münzen, ich hoffe jeder versteht das?

Happy coding!