Hướng dẫn dùng shuffle characters trong PHP
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. Show
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à 187 3276 1267 15 1267 34598 3467 125 1793, 187 3276 1267 15 1267 34598 3467 125 1794 và 187 3276 1267 15 1267 34598 3467 125 1795. Với 187 3276 1267 15 1267 34598 3467 125 1796, giá trị tối thiểu và tối đa của các integer (số nguyên) mà bạn có thể tạo nằm giữa 187 3276 1267 15 1267 34598 3467 125 1797 và giá trị được trả về bởi 187 3276 1267 15 1267 34598 3467 125 1798. Trước khi có PHP 7.1.0, hàm này chậm hơn khoảng bốn lần so với 187 3276 1267 15 1267 34598 3467 125 1799. Tuy nhiên, bắt đầu từ PHP 7.1.0, nó đã thành một alias của 187 3276 1267 15 1267 34598 3467 125 1799. Tuy nhiên, không giống như 187 3276 1267 15 1267 34598 3467 125 1799, bạn có thể đặt giá trị của 102 thấp hơn 103 mà không gây ra lỗi. Với 187 3276 1267 15 1267 34598 3467 125 1799, các giá trị tối thiểu và tối đa của integer bạn có thể tạo nằm giữa 187 3276 1267 15 1267 34598 3467 125 1797 và giá trị được trả về bởi 106. Nó dựa vào triển khai của Mersenne Twister để tạo ra các số ngẫu nhiên. Xem ra, mặc dù trước khi có PHP 7.1.0, hàm này đã triển khai một phiên bản thuật toán không chính xác để tạo ra các số. Tuy nhiên, hàm này đã được sửa trong các phiên bản mới hơn. 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 107 để seed trình tạo số ngẫu nhiên và truyền 108 làm giá trị của tham số thứ hai. Hàm 187 3276 1267 15 1267 34598 3467 125 1799 có chu kỳ 219937−1, về cơ bản có nghĩa là trong trường hợp tốt nhất bạn có được số lượng ngẫu nhiên 219937−1 trước khi chuỗi bắt đầu lặp lại. Bạn nên lưu ý rằng việc lặp lại một chuỗi không giống như việc lặp lại một số cụ thể. Nói cách khác, bạn có thể nhận được cùng một số ngẫu nhiên hai lần, nhưng điều đó không có nghĩa là chính chuỗi đó đã bắt đầu lặp lại. Trình tự sau đây là một ví dụ: 1 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 110 trong PHP là lựa chọn tốt nhất của bạn. Nó sẽ tạo các số ngẫu nhiên giữa các giá trị 103 và 102 được cung cấp, mặc định là 113 và 114. Thật không may, hàm này chỉ có bắt đầu hỗ trợ từ PHP 7.0. Đối với các phiên bản trước đó, bạn có thể sử dụng polyfill này trên GitHub. 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 106. Ví dụ sau đây sẽ minh họa cách tạo ra một số float ngẫu nhiên trong khoảng từ 0 đến 1 hoặc giữa bất kỳ giới hạn tối thiểu và tối đa nào khác. 1
2 3 // Output: 0.69458310943776
4 echo mt_rand(0, mt_getrandmax())/mt_getrandmax(); 5 187 3276 1267 15 1267 34598 3467 125 170 187 3276 1267 15 1267 34598 3467 125 171 187 3276 1267 15 1267 34598 3467 125 172 187 3276 1267 15 1267 34598 3467 125 173 187 3276 1267 15 1267 34598 3467 125 174 187 3276 1267 15 1267 34598 3467 125 175 187 3276 1267 15 1267 34598 3467 125 176 187 3276 1267 15 1267 34598 3467 125 177 187 3276 1267 15 1267 34598 3467 125 178 187 3276 1267 15 1267 34598 3467 125 179 10 11 12 13 14 15 16 17 18 19
0
1
2Khi 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á 116. Bằng cách này, chúng tôi có thể chắc chắn rằng việc thêm phần float sẽ không lấy số vượt quá giới hạn tối đa. 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 187 3276 1267 15 1267 34598 3467 125 1796 và 187 3276 1267 15 1267 34598 3467 125 1799 trước khi tạo bất kỳ số ngẫu nhiên nào. Hàm mà seed 187 3276 1267 15 1267 34598 3467 125 1796 được gọi là 120 và hàm tạo seed 187 3276 1267 15 1267 34598 3467 125 1799 được gọi là 122. Đ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 187 3276 1267 15 1267 34598 3467 125 1796 và 187 3276 1267 15 1267 34598 3467 125 1799 sẽ không nhất thiết tạo ra các số ngẫu nhiên tốt hơn. Trong thực tế, sử dụng cùng một seed mỗi lần sẽ cho bạn cùng một số ngẫu nhiên! 1
2 3
74
95 21 187 3276 1267 15 1267 34598 3467 125 170 187 3276 1267 15 1267 34598 3467 125 172
7187 3276 1267 15 1267 34598 3467 125 174
9187 3276 1267 15 1267 34598 3467 125 176 21 187 3276 1267 15 1267 34598 3467 125 178 10
711
913 21 15 16
2Seed 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. 1
2 3
74 5 // Output: 0.69458310943776
6187 3276 1267 15 1267 34598 3467 125 170 187 3276 1267 15 1267 34598 3467 125 172 // Output: 0.69458310943776
9187 3276 1267 15 1267 34598 3467 125 174 41 187 3276 1267 15 1267 34598 3467 125 176 43 187 3276 1267 15 1267 34598 3467 125 178 187 3276 1267 15 1267 34598 3467 125 179 10 11 48 13 echo mt_rand(0, mt_getrandmax())/mt_getrandmax();0 15 16 echo mt_rand(0, mt_getrandmax())/mt_getrandmax();3 18 echo mt_rand(0, mt_getrandmax())/mt_getrandmax();5 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 125. Hàm này sẽ trả về cho bạn một chuỗi xáo trộn ngẫu nhiên. Bắt đầu từ PHP 7.1, thuật toán xác định thứ tự ngẫu nhiên của các ký tự trong chuỗi kết quả đã được thay đổi thành Mersenne Twister. 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ụ: 1
2 3 50 4 52 5 54 187 3276 1267 15 1267 34598 3467 125 170 187 3276 1267 15 1267 34598 3467 125 172 57 187 3276 1267 15 1267 34598 3467 125 174 59 187 3276 1267 15 1267 34598 3467 125 176 187 3276 1267 15 1267 34598 3467 125 1701 187 3276 1267 15 1267 34598 3467 125 178 10
2Kế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. 1
2 3 57 4 5 187 3276 1267 15 1267 34598 3467 125 1712 187 3276 1267 15 1267 34598 3467 125 170 187 3276 1267 15 1267 34598 3467 125 1714 187 3276 1267 15 1267 34598 3467 125 172 187 3276 1267 15 1267 34598 3467 125 1716 187 3276 1267 15 1267 34598 3467 125 174 187 3276 1267 15 1267 34598 3467 125 1718 187 3276 1267 15 1267 34598 3467 125 176 187 3276 1267 15 1267 34598 3467 125 1720 187 3276 1267 15 1267 34598 3467 125 178 187 3276 1267 15 1267 34598 3467 125 1722 10 187 3276 1267 15 1267 34598 3467 125 1724 11 13 187 3276 1267 15 1267 34598 3467 125 1727 15 187 3276 1267 15 1267 34598 3467 125 179 16 18 187 3276 1267 15 1267 34598 3467 125 1732
0187 3276 1267 15 1267 34598 3467 125 1734
1187 3276 1267 15 1267 34598 3467 125 1736 187 3276 1267 15 1267 34598 3467 125 1737 187 3276 1267 15 1267 34598 3467 125 1738 187 3276 1267 15 1267 34598 3467 125 1734 187 3276 1267 15 1267 34598 3467 125 1740 187 3276 1267 15 1267 34598 3467 125 1741 187 3276 1267 15 1267 34598 3467 125 1742 187 3276 1267 15 1267 34598 3467 125 1743 187 3276 1267 15 1267 34598 3467 125 1744 187 3276 1267 15 1267 34598 3467 125 1745 187 3276 1267 15 1267 34598 3467 125 1746
2Bạ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 110 thay vì 187 3276 1267 15 1267 34598 3467 125 1799. 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 128 hoặc hàm 129. Cả hai sẽ tạo ra hash của một chuỗi nhập vào. 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ư 130 làm dữ liệu nhập vào. Theo mặc định, 131 sẽ trả về chuỗi hexadecimal 32 ký tự và 132 sẽ trả về chuỗi hexadecimal 40 ký tự. Chúng có thể được cắt theo một độ dài cụ thể bằng cách sử dụng hàm 133. Dưới đây là một ví dụ kết quả được trả về bởi các hàm này: 1
2 3 187 3276 1267 15 1267 34598 3467 125 1752 4 187 3276 1267 15 1267 34598 3467 125 1754 5 187 3276 1267 15 1267 34598 3467 125 170 187 3276 1267 15 1267 34598 3467 125 1757 187 3276 1267 15 1267 34598 3467 125 172 187 3276 1267 15 1267 34598 3467 125 1759 187 3276 1267 15 1267 34598 3467 125 174 187 3276 1267 15 1267 34598 3467 125 176 187 3276 1267 15 1267 34598 3467 125 1762 187 3276 1267 15 1267 34598 3467 125 178 187 3276 1267 15 1267 34598 3467 125 1764 10 11 187 3276 1267 15 1267 34598 3467 125 1767 13 187 3276 1267 15 1267 34598 3467 125 1769 15 16
2Như 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 134 để tạo các byte giả ngẫu nhiên được bảo mật mã hóa. Tham số 135 xác định chuỗi kết quả sẽ dài bao nhiêu. 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 136 để chuyển đổi chúng thành giá trị hexadecimal. Điều này sẽ làm tăng gấp đôi chiều dài của chuỗi. 1
2 3 187 3276 1267 15 1267 34598 3467 125 1777 4 187 3276 1267 15 1267 34598 3467 125 1779 5 187 3276 1267 15 1267 34598 3467 125 170 187 3276 1267 15 1267 34598 3467 125 1782 187 3276 1267 15 1267 34598 3467 125 172 187 3276 1267 15 1267 34598 3467 125 1784 187 3276 1267 15 1267 34598 3467 125 174 187 3276 1267 15 1267 34598 3467 125 176 187 3276 1267 15 1267 34598 3467 125 1787 187 3276 1267 15 1267 34598 3467 125 178 187 3276 1267 15 1267 34598 3467 125 1789 10 11
2Mộ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à 137. Giá trị của tham số thứ hai có thể được dùng để xác định xem chuỗi kết quả sẽ được tạo bằng thuật toán bảo mật mã hóa hay không. 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 138, bạn có thể chọn bộ ký tự nào xuất hiện trong chuỗi ngẫu nhiên của mình. Với sha1 () và md5 (), bạn có thể dễ dàng tạo các chuỗi thập lục phân ngẫu nhiên và với Random_bytes () bạn có thể tạo các chuỗi bảo mật bằng mật mã. Điều này sẽ cho phép bạn tạo ra các tên file và username ngẫu nhiên nhưng khó đoán. |