如何生成新的GUID?

问题描述 投票:0回答:8

我正在开发一个 Web 服务,它需要一个新的

GUID()
作为对服务内方法的引用传递。

我不熟悉

C#
GUID() object
,但需要类似的
PHP
(因此创建一个新对象,根据我的理解,它返回一个
empty/blank GUID
)。

有什么想法吗?

php guid
8个回答
83
投票

您可以尝试以下方法:

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


30
投票

作为上述选项的替代方案:

$guid = bin2hex(openssl_random_pseudo_bytes(16));

它给出了一个类似

412ab7489d8b332b17a2ae127058f4eb

的字符串

10
投票
<?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 生成器


7
投票

根据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

在大多数情况下,使用 UUID 的 PHP 库之一应该没问题。我不认为您在干预 Microsoft 组件对象模型 (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


3
投票

如果您只需要一个非常独特的ID:

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

如果 ID 的生成间隔超过 1 毫秒,则它们 100% 唯一。

如果以较短的间隔生成两个 ID,则将生成 99.9999999999999999999% 可能是全局唯一的 ID(10^18 中的 1 发生冲突)

您可以通过添加更多数字来增加此数字,但要生成 100% 唯一 ID,您将需要使用全局计数器。

如果您确实需要 RFC 合规性,这将作为有效的版本 4 GUID:

$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


1
投票

您可以查看此库来简单地创建与 Microsoft (C#) GUID 兼容的 GUID:https://github.com/semiorbit/guid

安装:(无依赖项或要求)

composer require semiorbit/guid

然后在你的代码中:

use SemiorbitGuid\Guid;

echo Guid::NewGuid();

// OUTPUT:
// {6BE33503-D448-0264-11AC-38822224B694}

您还可以通过定义参数来创建不带大括号或破折号的 GUID:

Guid::NewGuid(string $separator = '-', bool $enclose = true) : string

希望这会有所帮助。


0
投票

如果需要生成自定义GIUD,可以使用此功能

public static function geterateGUID()
        {
            $hyphen = chr(45);
            $part_1 = self::take("0123456789abcdef", 8);
            $part_2 = self::take("0123456789abcdef", 4);
            $part_3 = self::take("12345", 1) . self::take("0123456789abcdef", 3);
            $part_4 = self::take("89ab", 1) . self::take("0123456789abcdef", 3);
            $part_5 = self::take("0123456789abcdef", 12);
    
            return $part_1 . $hyphen . $part_2 . $hyphen . $part_3 . $hyphen . $part_4 . $hyphen . $part_5;
        }
    
        public static function take($string, $len)
        {
            $random_string = "";
    
            for ($i = 0; $i < $len; $i++) {
                $random_string[$i] = $string[rand(0, strlen($string) - 1)];
            }
    
            return $random_string;
        }
© www.soinside.com 2019 - 2024. All rights reserved.