PHP là một trong những ngôn ngữ lập trình phổ biến hơn trên thế giới.
Được phát hành lần đầu tiên vào năm 1995 như một cách để xây dựng các ứng dụng web động, PHP là ngôn ngữ kịch bản được đánh máy động với sự tương đồng với Perl và C. Mặc dù được coi là ngôn ngữ lập trình mục đích chung, PHP chủ yếu được sử dụng để xây dựng các trang web.
Cách tạo UUID trong PHP
PHP không có hỗ trợ tích hợp để tạo UUID tuân thủ RFC 4122. Hàm, uniqid(), không phải là một sự thay thế đầy đủ để tạo UUID tuân thủ RFC 4122 vì nó có thể không phải lúc nào cũng tạo ra một giá trị duy nhất (đặc biệt là nếu máy tính của bạn nhanh) và nó chỉ có thể tạo ra tối đa 23 ký tự.not have built-in support for generating RFC 4122 compliant UUIDs. The function, uniqid(), is not a sufficient replacement for generating RFC 4122 compliant UUIDs as it may not always generate a unique value (especially if your computer is fast) and it can only generate a maximum of 23 characters.
Tuy nhiên, bên dưới bạn sẽ tìm thấy hai giải pháp của bên thứ 3 khả thi để tạo UUID tuân thủ RFC 4122 trong PHP.
1. Chức năng tạo UUID của bạn trong PHP
Hàm trợ giúp nhỏ này tạo ra UUID Phiên bản 4 tuân thủ RFC 4122.
function guidv4($data = null) {
// Generate 16 bytes (128 bits) of random data or use the data passed into the function.
$data = $data ?? random_bytes(16);
assert(strlen($data) == 16);
// Set version to 0100
$data[6] = chr(ord($data[6]) & 0x0f | 0x40);
// Set bits 6-7 to 10
$data[8] = chr(ord($data[8]) & 0x3f | 0x80);
// Output the 36 character UUID.
return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
}
Ghi chú
- Hàm này yêu cầu Php 7 trở lên vì sử dụng chức năng Random_Bytes trên dòng #3.
- Nếu bạn đang sử dụng Php 5 hoặc sớm hơn và cài đặt tiện ích mở rộng OpenSSL, bạn có thể sử dụng openssl_random_pseudo_bytes(16), thay vì random_bytes(16) trên dòng số 3.
- Tín dụng đi đến câu trả lời này trên StackOverflow cho giải pháp này.
- Một ví dụ sử dụng chức năng này sẽ trông như thế này:
$myuuid = guidv4();
echo $myuuid;
2. Sử dụng thư viện PHP ramsey/uuid
Nếu bạn đang sử dụng Trình soạn thảo để quản lý các phụ thuộc trong dự án PHP của mình, bạn có thể sử dụng thư viện PHP ramsey/uuid để tạo UUID.
Để bắt đầu với thư viện, bạn có thể cài đặt và thêm nó vào dự án của mình như thế này:
% composer require ramsey/uuid
Bây giờ bạn có thể sử dụng nó trong dự án PHP của bạn. Dưới đây là một ví dụ nhỏ về việc tạo UUID với thư viện này:
use Ramsey/Uuid/Uuid;
$myuuid = Uuid::uuid4();
printf("Your UUID is: %s", $myuuid->toString());
chúng tôi có thể làm thế nào để cải thiện trang này? Hãy cho chúng tôi biết!
Vì vậy, tôi đã thực hiện một số đào xung quanh và tôi đã cố gắng ghép lại một hàm tạo ra UUID V4 hợp lệ trong PHP. Đây là lần gần nhất tôi có thể đến. Kiến thức của tôi về hex, thập phân, nhị phân, các nhà khai thác bitwise của PHP và những thứ tương tự gần như không tồn tại. Hàm này tạo ra một UUID V4 hợp lệ cho đến một khu vực. Một UUID V4 nên ở dạng:
xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx4xxx-yxxx-xxxxxxxxxxxx
Trong đó y là 8, 9, A hoặc B. Đây là nơi các chức năng thất bại vì nó không tuân thủ điều đó.y is 8, 9, A, or B. This is where the functions fails as it doesn't adhere to that.
Tôi đã hy vọng ai đó có nhiều kiến thức hơn tôi trong lĩnh vực này có thể giúp tôi một tay và giúp tôi sửa chữa chức năng này để nó tuân thủ quy tắc đó.
Chức năng như sau:
<?php function gen_uuid() { $uuid = array( 'time_low' => 0, 'time_mid' => 0, 'time_hi' => 0, 'clock_seq_hi' => 0, 'clock_seq_low' => 0, 'node' => array() ); $uuid['time_low'] = mt_rand(0, 0xffff) + (mt_rand(0, 0xffff) << 16); $uuid['time_mid'] = mt_rand(0, 0xffff); $uuid['time_hi'] = (4 << 12) | (mt_rand(0, 0x1000)); $uuid['clock_seq_hi'] = (1 << 7) | (mt_rand(0, 128)); $uuid['clock_seq_low'] = mt_rand(0, 255); for ($i = 0; $i < 6; $i++) { $uuid['node'][$i] = mt_rand(0, 255); } $uuid = sprintf('%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x', $uuid['time_low'], $uuid['time_mid'], $uuid['time_hi'], $uuid['clock_seq_hi'], $uuid['clock_seq_low'], $uuid['node'][0], $uuid['node'][1], $uuid['node'][2], $uuid['node'][3], $uuid['node'][4], $uuid['node'][5] ); return $uuid; } ?>