Hướng dẫn dùng uids trong PHP

answer

62

Bạn có thể thử những cách sau:

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

Nguồn - com_create_guid

62 hữu ích 4 bình luận chia sẻ

answer

22

Để thay thế cho các tùy chọn trên:

$guid = bin2hex(openssl_random_pseudo_bytes(16));

Nó cung cấp một chuỗi như 412ab7489d8b332b17a2ae127058f4eb

22 hữu ích 3 bình luận chia sẻ

answer

6

Theo Có bất kỳ sự khác biệt nào giữa GUID và UUID không?

GUID là sự triển khai tiêu chuẩn UUID của Microsoft.

Vì vậy, đây là một liên kết đến các thư viện, cho phép bạn tạo các UUID thuộc các loại sau:

  • phiên bản 1 (dựa trên thời gian)
  • phiên bản 3 (dựa trên tên và được băm với MD5)
  • phiên bản 4 (ngẫu nhiên)
  • phiên bản 5 (dựa trên tên và được băm với SHA1)

https://github.com/search?p=1&q=uuid+php&ref=cmdform&type=Repositories

Tôi không biết chính xác C # đang sử dụng cái nào, nhưng đó ít nhất là thứ bạn có thể sử dụng nếu bạn đang viết một số phần mềm và muốn có số nhận dạng duy nhất phổ quát.

Lựa chọn hoàn thiện của tôi là https://github.com/fredriklindberg/class.uuid.php vì nó chỉ là một tệp PHP đơn giản và tệp được đánh giá cao nhất ( https://github.com/ramsey/uuid ) phải phụ thuộc nhiều vào các thư viện khác, nhưng thư viện của anh ấy có thể sớm thay đổi (xem https://github.com/ramsey/uuid/issues/20 ).

Nhưng nếu bạn thực sự cần một GUID (theo tiêu chuẩn của Microsoft), chúng có quy trình tạo khác với 4122. Wikipedia tuyên bố rằng

GUID và UUID RFC 4122 phải giống hệt nhau khi hiển thị dưới dạng văn bản

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

Trong hầu hết các trường hợp, bạn sẽ ổn bằng cách sử dụng một trong các PHP lib cho UUID. Tôi không nghĩ rằng bạn đang can thiệp với Mô hình Đối tượng Thành phần của Microsoft (COM) , phải không?

6 hữu ích 2 bình luận chia sẻ

answer

6


Máy tạo GUID

6 hữu ích 0 bình luận chia sẻ

answer

4

Đối với những người dùng google chẳng hạn như tôi, tôi thấy đoạn trích này chính xác hơn:

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

nguồn http://guid.us/GUID/PHP

4 hữu ích 2 bình luận chia sẻ

answer

2

Nếu bạn chỉ cần một ID rất duy nhất:

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

Nếu ID được tạo cách nhau hơn 1 mili giây, chúng là duy nhất 100%.

Nếu hai ID được tạo trong khoảng thời gian ngắn hơn, điều này sẽ tạo ra các ID có khả năng là 99,999999999999999999% là duy nhất trên toàn cầu (xung đột ở 1 trong 10 ^ 18)

Bạn có thể tăng con số này bằng cách thêm nhiều chữ số hơn, nhưng để tạo 100% ID duy nhất, bạn sẽ cần sử dụng bộ đếm toàn cầu.

nếu bạn thực sự cần tuân thủ RFC, điều này sẽ chuyển thành GUID phiên bản 4 hợp lệ:

$guid = vsprintf('%s%s-%s-4000-8%.3s-%s%s%s0',str_split(dechex( microtime(true) * 1000 ) . bin2hex( random_bytes(8) ),4));

Điều này tuân theo ý định, nhưng không phải là thư của RFC. Trong số các sự khác biệt khác, nó ngắn một vài chữ số ngẫu nhiên. (Thêm nhiều chữ số ngẫu nhiên hơn nếu bạn cần) Ưu điểm là điều này rất nhanh, so với mã tuân thủ 100%. Bạn có thể kiểm tra GUID của mình tại đây

2 hữu ích 2 bình luận chia sẻ