Vietnamese (Tiếng Việt) translation by Vy Cam Nguyen (you can also view the original English article) Show
Hãy để tôi bắt đầu bài viết này bằng việc nói rằng hầu như không có sự kiện nào thực sự ngẫu
nhiên. Ngay cả kết quả của trò tung đồng xu kinh điển về mặt lý thuyết cũng có thể được dự đoán nếu chúng ta biết tác động của mọi yếu tố liên quan, như ma sát không khí, trọng lực và lực ban đầu. Việc tạo ra các chuỗi ngẫu nhiên gồm chữ và số cũng có nguyên tắc tương tự. Điều tốt đẹp nhất có thể chờ đợi là tạo ra những số và chuỗi không tuân theo một pattern(hình mẫu) và một kẻ tấn công về thực tiễn sẽ không thể đoán ra. Trong hướng dẫn này, chúng tôi sẽ đề cập đến các kỹ thuật khác nhau để tạo số và chuỗi ký tự chữ ngẫu nhiên trong PHP. Một số trong số chúng sẽ được mã hóa, trong khi một số khác chỉ dành cho nhu cầu thông thường, như gán tên file giả ngẫu nhiên hoặc tạo URL và đề xuất username(tên người dùng). Tạo ra các số ngẫu nhiên trong PHPCó ba hàm khác nhau để tạo số ngẫu nhiên trong PHP. Tất cả các hàm đó sẽ nhận một giá trị tối thiểu và tối đa có thể cho các số ngẫu nhiên và trả về một số ngẫu nhiên cho bạn. Đó là Với Với Hàm này thậm chí còn trở nên tốt hơn trong PHP 7.2.0 bằng cách loại bỏ
lỗi modulo. Điều này có nghĩa là đối với một số seed cụ thể, chuỗi số ngẫu nhiên của bạn bây giờ sẽ tốt hơn một chút so với các phiên bản cũ hơn. Măc dù một số code chuyên dụng thực sự có thể dựa vào khuynh hướng này. Nếu vậy, bạn có thể sử dụng thuật toán seed cũ hơn bằng cách gọi hàm Hàm 187 3276 1267 15 1267 34598 3467 125 17 Trong chuỗi trên, chúng tôi đã có 1267 hai lần trong kết quả, nhưng điều đó không có nghĩa là toàn bộ chuỗi bắt đầu lặp lại sau đó. Không thể có cùng một số lặp lại sớm như vậy trong một chuỗi ngẫu nhiên, nhưng điều đó có thể! Số nguyên ngẫu nhiên được mã hóa an toànNếu bạn muốn các số pseudo (giả) ngẫu nhiên được bảo mật bằng mã hóa, hàm Các số float ngẫu nhiênThay vì tạo integer ngẫu nhiên, có thể bạn cũng muốn tạo số float. Điều này có thể được thực hiện dễ dàng bằng cách chia một số ngẫu nhiên với giá trị được trả về bởi <?php // Output: 0.69458310943776 echo mt_rand(0, mt_getrandmax())/mt_getrandmax(); function mt_random_float($min, $max) { $float_part = mt_rand(0, mt_getrandmax())/mt_getrandmax(); $integer_part = mt_rand($min, $max - 1); return $integer_part + $float_part; } // Output: 10.199064863938 echo mt_random_float(10, 11); // Output: 35.540808309121 echo mt_random_float(15, 50); ?> Khi tạo số float ngẫu nhiên giữa các giới hạn nhất định, chúng tôi đảm bảo rằng các integer ngẫu nhiên không vượt quá Seed cho trình tạo số ngẫu nhiênMột khái niệm cần một chút giải thích là seeds. Nói một cách đơn giản, đây chỉ là những số có thể được sử dụng để khởi tạo các hàm Điều quan trọng cần nhớ là việc cung cấp một giá trị seed ban đầu mỗi lần trước khi gọi <?php mt_srand(10); // Output: 1656398468 echo mt_rand(); mt_srand(10); // Output: 1656398468 echo mt_rand(); mt_srand(10); // Output: 1656398468 echo mt_rand(); ?> Seed một số ngẫu nhiên rất hữu ích trong các tình huống mà bạn muốn tạo một chuỗi ngẫu nhiên nhưng có thể lặp lại. Đoạn mã sau tạo ra cùng một chuỗi các số ngẫu nhiên khi chạy hai lần. <?php mt_srand(10); $count = 0; while($count < 10) { echo mt_rand(0, 100)." "; $count++; } // Output on First Run: // 68 58 68 13 3 48 30 37 96 82 // Output on Second Run: // 68 58 68 13 3 48 30 37 96 82 Việc tạo các chuỗi ngẫu nhiên có thể lặp lại theo cách này có thể giúp gỡ lỗi các chương trình đang được thử nghiệm bằng cách sử dụng dữ liệu ngẫu nhiên nếu bạn theo dõi seed, bạn có thể sao chép cùng một dữ liệu đầu vào để tìm ra lỗi sai. Tạo chuỗi ký tự ngẫu nhiên trong PHPCó nhiều cách để tạo chuỗi ký tự chữ và số ngẫu nhiên và bạn sử dụng cái gì thì sẽ phụ thuộc nhu cầu của bạn. Tạo ra các chuỗi xáo trộnNếu bạn muốn tạo các chuỗi ký tự chữ và số ngẫu nhiên từ một bộ ký tự cố định, bạn có thể sử dụng hàm Hãy nhớ rằng chuỗi ngẫu nhiên được tạo theo cách này không an toàn về mặt bảo mật mã hóa. Tuy nhiên, chuỗi vẫn sẽ không thể đoán trước được khi nhu cầu sử dụng phổ biến như tạo tên file hoặc URL ngẫu nhiên. Đây là vài ví dụ: <?php $permitted_chars = '0123456789abcdefghijklmnopqrstuvwxyz'; // Output: 54esmdr0qf echo substr(str_shuffle($permitted_chars), 0, 10); $permitted_chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; // Output: video-g6swmAP8X5VG4jCi.mp4 echo 'video-'.substr(str_shuffle($permitted_chars), 0, 16).'.mp4'; ?> Kết quả của bạn có thể sẽ khác nhau trong cả hai trường hợp. Trong trường hợp đầu tiên, chúng tôi chỉ xáo trộn chuỗi ký tự được phép và sau đó lấy 10 ký tự đầu tiên của chuỗi đó. Trong trường hợp thứ hai, chúng tôi đã thêm "video" vào đầu chuỗi được tạo và ".mp4" ở cuối. Phương pháp tạo chuỗi ký tự chữ và số ngẫu nhiên này rất dễ dàng, nhưng gặp phải một vài vấn đề. Ví dụ: bạn sẽ không bao giờ có được các ký tự giống nhau trong chuỗi ngẫu nhiên của mình hai lần. Ngoài ra, độ dài của chuỗi kết quả ngẫu nhiên chỉ có thể dài bằng chuỗi nhập vào. Tạo chuỗi ngẫu nhiênNếu các vấn đề tôi liệt kê ở trên là một tác nhân làm hỏng vấn đề, bạn có thể muốn xem xét một số triển khai khác. Các code sau đây sẽ giải quyết cả hai vấn đề này. <?php $permitted_chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; function generate_string($input, $strength = 16) { $input_length = strlen($input); $random_string = ''; for($i = 0; $i < $strength; $i++) { $random_character = $input[mt_rand(0, $input_length - 1)]; $random_string .= $random_character; } return $random_string; } // Output: iNCHNGzByPjhApvn7XBD echo generate_string($permitted_chars, 20); // Output: 70Fmr9mOlGID7OhtTbyj echo generate_string($permitted_chars, 20); // Output: Jp8iVNhZXhUdSlPi1sMNF7hOfmEWYl2UIMO9YqA4faJmS52iXdtlA3YyCfSlAbLYzjr0mzCWWQ7M8AgqDn2aumHoamsUtjZNhBfU echo generate_string($permitted_chars, 100); ?> Bạn có thể sửa đổi nó để bổ sung các hậu tố và tiền tố cụ thể vào chuỗi ngẫu nhiên vừa được tạo. Những người đang sử dụng PHP 7 có thể cải thiện hơn nữa việc tạo chuỗi bằng
cách sử dụng hàm bảo mật mã hóa Tạo chuỗi hexadecimal (thập lục phân) ngẫu nhiênNếu bạn muốn tạo các chuỗi thập lục phân ngẫu nhiên trong PHP, bạn cũng có thể sử dụng hàm Bạn sẽ tiếp tục nhận được các giá trị hash duy nhất miễn là dữ liệu vào là duy nhất. Điều này có thể đạt được bằng cách sử dụng kết quả của hàm như Dưới đây là một ví dụ kết quả được trả về bởi các hàm này: <?php // Output: 36e5e490f14b031e echo substr(md5(time()), 0, 16); // Output: aa88ef597c77a5b3 echo substr(sha1(time()), 0, 16); // Output: 447c13ce896b820f353bec47248675b3 echo md5(time()); // Output: 6c2cef9fe21832a232da7386e4775654b77c7797 echo sha1(time()); ?> Như bạn có thể thấy, việc tạo các chuỗi hexadecimal ngẫu nhiên và duy nhất dài tới 40 ký tự rất dễ dàng trong PHP. Tạo chuỗi ngẫu nhiên có bảo mật mã hóaBa hàm để tạo các chuỗi ký tự chữ và số ngẫu nhiên mà chúng ta đã thảo luận cho đến nay
không có bảo mật mã hóa. May mắn thay, PHP cũng có một hàm Khi bạn có kết quả dưới dạng byte ngẫu nhiên, bạn có thể sử dụng hàm <?php // Output: b7b33efa07915b60ad55 echo bin2hex(random_bytes(10)); // Output: a2e6cb1f25616324c8a11a2cceb0b47c590949ea echo bin2hex(random_bytes(20)); // Output: 25af3b86e11884ef5e8ef70a0ad06cba81b89ed6af3781a0 echo bin2hex(random_bytes(24)); ?> Một chức năng khác mà bạn có thể sử dụng để tạo các byte ngẫu nhiên được bảo mật mã hóa là Tổng kếtTrong hướng dẫn này, chúng tôi đã xem xét việc tạo ra các số và các chuỗi ký tự chữ ngẫu nhiên trong PHP. Việc tạo ra số ngẫu nhiên có thể hữu ích trong nhiều tình huống, như trong các trò chơi mà bạn phải tạo ra những kẻ thù hoặc ngẫu nhiên cung cấp cho người chơi một số manh mối về các chữ cái để họ có thể tạo thành một từ hoàn chỉnh. Cũng giống như các số ngẫu
nhiên, việc tạo ra các chuỗi chữ và số ngẫu nhiên cũng có thể khá hữu ích trong nhiều trường hợp. Với sự trợ giúp của Tôi hy vọng bạn thích hướng dẫn này. Nếu bạn có bất kỳ câu hỏi, hãy nêu lên trong phần bình luận. |