如何生成新的GUID?

时间:2014-02-10 07:20:43

标签: php guid

我正在处理一项Web服务,该服务需要传递新的GUID()作为对服务中方法的引用。

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

有什么想法吗?

6 个答案:

答案 0 :(得分:38)

您可以尝试以下操作:

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));
}

Source - com_create_guid

答案 1 :(得分:13)

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

412ab7489d8b332b17a2ae127058f4eb

它提供了一个类似 drawer.closeDrawer(GravityCompat.START);

的字符串

答案 2 :(得分:5)

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

答案 3 :(得分:3)

根据Is there any difference between a GUID and a 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)对其他库有很多依赖性,但是他可能很快就会改变(参见{{3} }})。

但是如果你真的需要GUID(根据微软标准),他们的生成过程与4122不同。维基百科声称

  

GUID和RFC 4122 UUID在文本显示时应该相同

https://github.com/ramsey/uuid/issues/20

在大多数情况下,你可以选择其中一个用于UUID的PHP库。我不认为你是在干扰 Microsoft组件对象模型(COM),不是吗?

答案 4 :(得分:2)

对于像我这样的google, 我发现这个snipet更准确:

public class Activator implements BundleActivator {
    DefaultCamelContext camelContext;

    public void start(BundleContext context) {
        System.out.println("Starting the bundle");
        camelContext = new DefaultCamelContext();
        try {
            camelContext.setName("JavaDSLContext");
            camelContext.addRoutes(new FileRouter());
            camelContext.start();
        } catch (Exception ex) {
            System.out.println("Exception occured! " + ex.getMessage());
        }
    }

    public void stop(BundleContext context) {
        System.out.println("Stopping the bundle");
        if (camelContext != null) {
           try { 
              camelContext.stop();
           } catch (Exception ex) {
              System.out.println("Exception occured during stop context.");
           }
        }
    }   
}

来源http://guid.us/GUID/PHP

答案 5 :(得分:0)

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

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

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

如果以较短的时间间隔生成两个ID,则将生成99.9999999999999999%的ID具有全局唯一性(冲突10中的1 ^ 18)

您可以通过添加更多数字来增加此数字,但是要生成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%兼容的代码相比,这样做的好处是速度快。您可以test your GUID here