Hướng dẫn how to generate a random id in php? - làm thế nào để tạo một id ngẫu nhiên trong php?

❮ Php TÀI LIỆU THAM KHẢO

Định nghĩa và cách sử dụng

Hàm uniqid [] tạo ra một id duy nhất dựa trên microtime [thời gian hiện tại tính bằng micro giây].

Lưu ý: ID được tạo từ hàm này không đảm bảo tính duy nhất của giá trị trả về! Để tạo ra một cực kỳ khó dự đoán ID, hãy sử dụng hàm md5 []. The generated ID from this function does not guarantee uniqueness of the return value! To generate an extremely difficult to predict ID, use the md5[] function.

Cú pháp

uniqid [tiền tố, more_entropy]

Giá trị tham số

Tham sốSự mô tả
tiếp đầu ngữKhông bắt buộc. Chỉ định một tiền tố cho ID duy nhất [hữu ích nếu hai tập lệnh tạo ID chính xác cùng một micro giây]
More_entropyKhông bắt buộc. Chỉ định thêm entropy ở cuối giá trị trả về. Điều này sẽ làm cho kết quả độc đáo hơn. Khi được đặt thành true, chuỗi trả về sẽ là 23 ký tự. Mặc định là sai và chuỗi trả về sẽ dài 13 ký tự

Chi tiết kỹ thuật

Giá trị trở lại:Phiên bản PHP:Changelog:
Trả về định danh duy nhất, dưới dạng chuỗi
4+
Tham số tiền tố đã trở thành tùy chọn trong PHP 5.0. Giới hạn dài 114 ký tự cho tiền tố đã được nâng lên trong PHP 4.3.1.
The limit of 114 characters long for prefix was raised in PHP 4.3.1.

❮ Php TÀI LIỆU THAM KHẢO


Hình ảnh Scott-Cartwright/Getty

Cập nhật vào ngày 02 tháng 10 năm 2018

Một ID người dùng duy nhất có thể được tạo trong PHP bằng hàm uniqid []. Hàm này có hai tham số & nbsp; bạn có thể đặt.

Đầu tiên là tiền tố, đó là những gì sẽ được thêm vào đầu mỗi ID. Thứ hai là nhiều hơn_entropy. Nếu điều này là sai hoặc không được chỉ định, nó sẽ trả về 13 ký tự; Nếu đó là & nbsp; đúng, 23 ký tự sẽ được trả lại.

Ví dụ để tạo một ID duy nhất

Dưới đây là các ví dụ về việc tạo một ID người dùng duy nhất, nhưng mỗi cái hơi khác nhau.

Đầu tiên tạo ra một ID duy nhất bình thường trong khi lần thứ hai cho thấy cách tạo ID dài hơn. Ví dụ thứ ba tạo một ID có số ngẫu nhiên là tiền tố trong khi dòng cuối cùng có thể được sử dụng để mã hóa tên người dùng trước khi lưu trữ nó.

//creates a unique id with the 'about' prefix $a = uniqid[about]; echo $a; echo "
";
//creates a longer unique id with the 'about' prefix $b = uniqid [about, true]; Echo $b; echo "
";
//creates a unique ID with a random number as a prefix - more secure than a static prefix $c = uniqid [rand [],true]; echo $c; echo "
";
//this md5 encrypts the username from above, so its ready to be stored in your database $md5c = md5[$c]; echo $md5c; ?>

Thư viện tiêu chuẩn PHP 7 cung cấp chức năng

$bytes = random_bytes[20];
var_dump[bin2hex[$bytes]];
8 tạo ra các byte giả ngẫu nhiên bảo mật bằng mã hóa.

Example:

$bytes = random_bytes[20];
var_dump[bin2hex[$bytes]];

Ví dụ trên sẽ xuất ra một cái gì đó tương tự như:

string[40] "5fe69c95ed70a9869d9f9af7d8400a6673bb9ce9"

Thông tin thêm: //php.net/manual/en/function.random-bytes.php

Php 5 [lỗi thời]

Tôi chỉ đang xem xét cách giải quyết vấn đề tương tự này, nhưng tôi cũng muốn chức năng của mình tạo ra một mã thông báo có thể được sử dụng để truy xuất mật khẩu. Điều này có nghĩa là tôi cần giới hạn khả năng của mã thông báo được đoán. Bởi vì

$bytes = random_bytes[20];
var_dump[bin2hex[$bytes]];
9 dựa trên thời gian và theo php.net "giá trị trả về ít khác với microtime []",
$bytes = random_bytes[20];
var_dump[bin2hex[$bytes]];
9 không đáp ứng các tiêu chí. PHP khuyến nghị sử dụng
string[40] "5fe69c95ed70a9869d9f9af7d8400a6673bb9ce9"
1 thay vào đó để tạo mã thông báo bảo mật mật mã.

Một câu trả lời nhanh chóng, ngắn và đến điểm là:

bin2hex[openssl_random_pseudo_bytes[$bytes]]

sẽ tạo ra một chuỗi ngẫu nhiên các ký tự chữ và số có độ dài = $ byte * 2. Thật không may, điều này chỉ có bảng chữ cái là

string[40] "5fe69c95ed70a9869d9f9af7d8400a6673bb9ce9"
2, nhưng nó hoạt động.

Dưới đây là chức năng mạnh nhất mà tôi có thể làm cho điều đó đáp ứng các tiêu chí [đây là phiên bản được triển khai của câu trả lời của Erik].

function crypto_rand_secure[$min, $max]
{
    $range = $max - $min;
    if [$range < 1] return $min; // not so random...
    $log = ceil[log[$range, 2]];
    $bytes = [int] [$log / 8] + 1; // length in bytes
    $bits = [int] $log + 1; // length in bits
    $filter = [int] [1  $range];
    return $min + $rnd;
}

function getToken[$length]
{
    $token = "";
    $codeAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    $codeAlphabet.= "abcdefghijklmnopqrstuvwxyz";
    $codeAlphabet.= "0123456789";
    $max = strlen[$codeAlphabet]; // edited

    for [$i=0; $i < $length; $i++] {
        $token .= $codeAlphabet[crypto_rand_secure[0, $max-1]];
    }

    return $token;
}

string[40] "5fe69c95ed70a9869d9f9af7d8400a6673bb9ce9"
3 hoạt động như một sự sụt giảm trong thay thế cho
string[40] "5fe69c95ed70a9869d9f9af7d8400a6673bb9ce9"
4 hoặc
string[40] "5fe69c95ed70a9869d9f9af7d8400a6673bb9ce9"
5. Nó sử dụng openSSL_random_pseudo_bytes để giúp tạo một số ngẫu nhiên giữa $ min và $ max.

string[40] "5fe69c95ed70a9869d9f9af7d8400a6673bb9ce9"
6 tạo bảng chữ cái để sử dụng trong mã thông báo và sau đó tạo một chuỗi độ dài
string[40] "5fe69c95ed70a9869d9f9af7d8400a6673bb9ce9"
7.

Nguồn: //us1.php.net/manual/en/function.openssl-random-pseudo-byte.php#104322

Gagarine

4.0122 Huy hiệu vàng29 Huy hiệu bạc39 Huy hiệu đồng2 gold badges29 silver badges39 bronze badges

Đã trả lời ngày 5 tháng 12 năm 2012 lúc 22:25Dec 5, 2012 at 22:25

ScottscottScott

11.8K4 Huy hiệu vàng27 Huy hiệu bạc48 Huy hiệu đồng4 gold badges27 silver badges48 bronze badges

30

Thông báo bảo mật: Giải pháp này không nên được sử dụng trong các tình huống mà chất lượng của tính ngẫu nhiên của bạn có thể ảnh hưởng đến bảo mật của một ứng dụng. Cụ thể,

string[40] "5fe69c95ed70a9869d9f9af7d8400a6673bb9ce9"
4 và
string[40] "5fe69c95ed70a9869d9f9af7d8400a6673bb9ce9"
9 không phải là bộ tạo số ngẫu nhiên bảo mật bằng mã hóa. Xem câu trả lời của Scott để biết thay thế an toàn.
: This solution should not be used in situations where the quality of your randomness can affect the security of an application. In particular,
string[40] "5fe69c95ed70a9869d9f9af7d8400a6673bb9ce9"
4 and
string[40] "5fe69c95ed70a9869d9f9af7d8400a6673bb9ce9"
9 are not cryptographically secure random number generators. See Scott's answer for a secure alternative.

Nếu bạn không cần nó hoàn toàn độc đáo theo thời gian:

bin2hex[openssl_random_pseudo_bytes[$bytes]]
0

Mặt khác [cho bạn đã xác định một đăng nhập duy nhất cho người dùng của bạn]:

md5[uniqid[$your_user_login, true]]

Đã trả lời ngày 4 tháng 12 năm 2009 lúc 10:55Dec 4, 2009 at 10:55

Loletechloletechloletech

3.6621 Huy hiệu vàng14 Huy hiệu bạc3 Huy hiệu đồng1 gold badge14 silver badges3 bronze badges

6

Phiên bản hướng đối tượng của giải pháp được bỏ phiếu nhiều nhất

Tôi đã tạo một giải pháp hướng đối tượng dựa trên câu trả lời của Scott:Scott's answer:

Bài Viết Liên Quan

Chủ Đề