Lebih
PHP: Cara membuat random, unik, string alfanumerik?
Bagaimana itu akan mungkin untuk menghasilkan acak, unik string menggunakan angka dan huruf untuk digunakan dalam memverifikasi link? Seperti ketika anda membuat akun di situs web, dan mengirimkan email dengan link, dan anda harus klik link tersebut untuk memverifikasi akun anda...yeah...salah satu dari mereka.
Bagaimana saya dapat menghasilkan salah satu dari orang-orang yang menggunakan PHP?
Update: Hanya ingat tentang uniqid()
. It's sebuah fungsi PHP yang menghasilkan sebuah pengenal unik berdasarkan waktu saat ini di mikrodetik. Saya pikir saya'll gunakan itu.
354
27
Aku hanya melihat ke dalam bagaimana untuk memecahkan masalah yang sama, tapi saya juga ingin fungsi saya untuk membuat sebuah token yang dapat digunakan untuk pengambilan password juga. Ini berarti bahwa saya perlu untuk membatasi kemampuan token untuk ditebak. Karena
uniqid
didasarkan pada waktu, dan sesuai dengan php.net "nilai kembali adalah sedikit berbeda dari microtime()",uniqid
tidak memenuhi kriteria. PHP merekomendasikan menggunakanopenssl_random_pseudo_bytes()
bukan untuk menghasilkan cryptographically aman token.Cepat, singkat dan to the point jawabannya adalah:
yang akan menghasilkan string acak dari karakter alfanumerik panjang = $byte * 2. Sayangnya ini hanya memiliki alfabet
[a-f][0-9]
, tapi itu bekerja.Di bawah ini adalah fungsi terkuat saya bisa membuat yang memenuhi kriteria (Ini adalah aplikasi yang diimplementasikan versi Erik's jawaban).
crypto_rand_secure($min, $max)
bekerja sebagai drop-in penggantirand()
ataumt_rand
. Menggunakan openssl_random_pseudo_bytes untuk membantu membuat nomor acak antara $min, $max.method gettoken($panjang)
menciptakan alfabet untuk digunakan dalam token dan kemudian menciptakan sebuah string panjang$panjang
.EDIT: saya lupa mengutip sumber - http://us1.php.net/manual/en/function.openssl-random-pseudo-bytes.php#104322
EDIT (PHP7): Dengan rilis PHP7, perpustakaan standar sekarang memiliki dua fungsi baru yang dapat mengganti/memperbaiki/menyederhanakan crypto_rand_secure fungsi di atas.
random_bytes($panjang)
danrandom_int($min, $max)
http://php.net/manual/en/function.random-bytes.php
http://php.net/manual/en/function.random-int.php
Contoh:
Jika anda tidak perlu untuk menjadi benar-benar unik dari waktu ke waktu:
md5(uniqid(rand(), true))
Jika tidak (mengingat anda telah ditentukan login yang unik untuk anda pengguna):
Berorientasi objek versi paling up-memilih solusi
I've dibuat berorientasi objek solusi berdasarkan Scott's jawaban:
Penggunaan
Custom alfabet
Anda dapat menggunakan kustom alfabet jika diperlukan. Hanya lulus string dengan didukung karakter untuk konstruktor atau setter:
Berikut ini's output sampel
Saya berharap ini akan membantu seseorang. Cheers!
I'm terlambat tapi aku'm di sini dengan beberapa data penelitian didasarkan pada fungsi-fungsi yang disediakan oleh Scott's jawaban. Jadi saya set up Digital Ocean droplet hanya untuk 5 hari selama tes otomatis dan disimpan unik yang dihasilkan string dalam database MySQL.
Selama periode pengujian, saya menggunakan 5 panjang yang berbeda (5, 10, 15, 20, 50) dan +/-0.5 juta catatan yang dimasukkan untuk setiap panjang. Selama saya tes, hanya panjang 5 yang dihasilkan +/-3K duplikat dari 0,5 juta dan sisanya panjang didn't menghasilkan duplikat. Jadi kita dapat mengatakan bahwa jika kita menggunakan panjang 15 atau di atas dengan Scott's fungsi, maka kita dapat menghasilkan yang sangat handal unik string. Berikut ini adalah tabel yang menunjukkan data penelitian saya:
Update: Aku dibuat sederhana Heroku aplikasi menggunakan fungsi-fungsi yang mengembalikan token sebagai respon JSON. Aplikasi dapat diakses di https://uniquestrings.herokuapp.com/api/token?length=15
Saya harap ini membantu.
Fungsi ini akan menghasilkan kunci acak yang menggunakan angka dan huruf:
Contoh output:
Anda dapat menggunakan UUID(Universal Unique Identifier), dapat digunakan untuk tujuan apapun, dari otentikasi pengguna string untuk transaksi pembayaran id.
UUID ini 16 oktet (128-bit) nomor. Dalam bentuk kanonik, UUID diwakili oleh 32 digit heksadesimal, ditampilkan dalam lima kelompok yang dipisahkan oleh tanda hubung, dalam bentuk 8-4-4-4-12 untuk total 36 karakter (32 karakter alfanumerik dan empat tanda hubung).
//memanggil funtion
beberapa contoh output akan menjadi seperti:
berharap itu membantu seseorang di masa depan :)
Saya menggunakan ini satu-liner:
dimana suhu udara lebih panjang dari string yang diinginkan (dibagi 4, jika tidak maka akan dibulatkan ke angka terdekat habis dibagi 4)
Gunakan kode berikut untuk menghasilkan nomor acak dari 11 karakter atau mengubah jumlah sesuai kebutuhan anda.
atau kita dapat menggunakan fungsi kustom untuk menghasilkan nomor acak
e.g (dalam pseudo code)
Berikut ini adalah ultimate unik id generator untuk anda. dibuat oleh saya.
anda dapat echo setiap 'var' id anda seperti yang anda suka. tapi $mdun lebih baik, anda dapat mengganti md5, sha1 untuk untuk kode yang lebih baik tapi itu akan menjadi sangat panjang yang mungkin anda tidak perlu.
Terima kasih.
Ketika mencoba untuk menghasilkan password acak yang anda mencoba untuk :
Pertama menghasilkan cryptographically secure set random byte
Kedua adalah mengubah orang-orang random byte ke string cetak
Sekarang, ada beberapa cara untuk menghasilkan byte random di php seperti :
Kemudian anda ingin mengubah ini random byte ke string cetak :
Anda dapat menggunakan bin2hex :
atau base64_encode :
Namun, perhatikan bahwa anda tidak mengontrol panjang string jika anda menggunakan base64. Anda dapat menggunakan bin2hex untuk melakukan itu, menggunakan 32 byte akan berubah menjadi 64 char string. Tapi itu hanya akan bekerja seperti di BAHKAN string.
Jadi pada dasarnya anda hanya dapat melakukan :
Berikut adalah apa yang saya gunakan:
Untuk benar-benar random string, anda dapat menggunakan
output :
jadi bahkan jika anda mencoba untuk menghasilkan string beberapa kali di waktu yang bersamaan, anda akan mendapatkan output yang berbeda.
Saya ingin menggunakan hash kunci ketika berhadapan verifikasi link. Saya akan merekomendasikan menggunakan microtime dan hashing menggunakan MD5 karena seharusnya tidak ada alasan mengapa kunci harus sama karena hash berdasarkan microtime.
$key = md5(rand());
$key = md5(microtime());
Jika anda ingin menghasilkan sebuah string unik di PHP, coba berikut ini.
Dalam hal ini,
uniqid()
- Itu akan menghasilkan string unik. Fungsi ini mengembalikan timestamp berdasarkan pengenal unik sebagai string.mt_rand()
- Menghasilkan nomor acak.md5()
- akan menghasilkan hash string.setelah membaca contoh-contoh sebelumnya saya datang dengan ini:
Saya gandakan 10 kali array[0-9,A-Z] dan mengocok elemen, setelah saya mendapatkan titik awal acak untuk substr() untuk lebih 'kreatif' :) anda dapat menambahkan [a-z] dan unsur-unsur lain untuk array, duplikat lebih atau kurang, lebih kreatif dari saya
Ini adalah sebuah fungsi sederhana yang memungkinkan anda untuk menghasilkan string acak yang mengandung Huruf dan Angka (alphanumeric). Anda juga dapat membatasi panjang string. Ini random string dapat digunakan untuk berbagai tujuan, termasuk: Kode Referral, Kode Promosi, Kode Kupon. Fungsi bergantung pada berikut fungsi PHP: base_convert, sha1, uniqid, mt_rand
Berikut adalah apa yang saya'm menggunakan salah satu dari proyek-proyek saya, it's bekerja dan menghasilkan UNIK RANDOM TOKEN:
Harap dicatat bahwa saya dikalikan timestamp oleh tiga untuk menciptakan kebingungan bagi siapapun pengguna mungkin bertanya-tanya bagaimana token ini dihasilkan ;)
Saya berharap hal ini membantu :)
Saya pikir ini adalah metode terbaik untuk digunakan.