Lebih
Random string generasi dengan huruf dan angka
Saya ingin menghasilkan sebuah string dari ukuran N.
Ini harus terdiri dari angka dan huruf besar huruf bahasa inggris seperti:
- 6U1S75
- 4Z4UKK
- U911K4
Bagaimana saya bisa mencapai hal ini dalam pythonic cara?
1239
27
Jawaban dalam satu baris:
atau bahkan lebih pendek mulai dengan Python 3.6 menggunakan
acak.pilihan()
:Kode-kode atau sandi yang lebih aman versi; lihat https://stackoverflow.com/a/23728630/2213647:
Dalam rincian, dengan fungsi untuk selanjutnya digunakan kembali:
Bagaimana cara kerjanya ?
Kita impor
string
, sebuah modul yang berisi urutan umum karakter ASCII, danrandom
, sebuah modul yang berhubungan dengan generasi acak.string.ascii_uppercase + string.digit
hanya merangkai daftar karakter yang mewakili huruf ASCII karakter dan angka:Kemudian kita menggunakan daftar pemahaman untuk membuat daftar 'n' unsur-unsur:
Dalam contoh di atas, kita menggunakan
[
untuk membuat daftar, tapi kami don't dalamid_generator
fungsi jadi Python doesn't membuat daftar dalam memori, tetapi menghasilkan unsur-unsur on the fly, one by one (lebih lanjut tentang ini di sini).Bukannya meminta untuk membuat 'n' times string
elem
, kami akan meminta Python untuk membuat 'n' times karakter acak, diambil dari urutan karakter:Oleh karena itu
acak.pilihan(karakter) untuk _ dalam jangkauan(size)
benar-benar adalah membuat urutanukuran
karakter. Karakter yang secara acak diambil darikarakter
:Maka kita hanya bergabung dengan mereka dengan string kosong sehingga urutan tersebut menjadi sebuah string:
Ini Stack Overflow quesion saat ini Google atas hasil untuk "random string Python". Saat ini beberapa jawabannya:
Ini adalah metode yang sangat baik, tapi PRNG di acak tidak cryptographically aman. Saya berasumsi banyak orang meneliti pertanyaan ini akan ingin menghasilkan string acak untuk enkripsi atau password. Anda dapat melakukan ini dengan aman dengan membuat perubahan kecil di kode di atas:
Menggunakan
acak.SystemRandom()
bukan hanya acak menggunakan /dev/urandom pada *nix mesin danCryptGenRandom()
pada Windows. Ini adalah cryptographically aman PRNGs. Menggunakanacak.pilihan
bukanacak.SystemRandom().pilihan
dalam aplikasi yang membutuhkan aman PRNG bisa berpotensi menghancurkan, dan mengingat popularitas dari pertanyaan ini, saya yakin bahwa kesalahan telah dibuat berkali-kali sudah.Jika anda're menggunakan python3.6 atau di atas, anda bisa menggunakan rahasia modul seperti yang disebutkan dalam MSeifert's jawaban:
Modul docs juga membahas cara mudah untuk menghasilkan aman token dan praktek-praktek terbaik.
Hanya menggunakan Python's builtin uuid:
Jika Uuid baik-baik saja untuk keperluan anda, menggunakan built-in uuid paket.
Salah Satu Solusi Baris:
impor uuid; uuid.uuid4().hex.upper()[0:6]
Di Kedalaman Versi:
Contoh:
Jika anda perlu benar-benar anda format (misalnya, "6U1S75"), anda dapat melakukannya seperti ini:
Lebih sederhana, lebih cepat, tapi sedikit kurang cara acak adalah dengan menggunakan
acak.sampel
bukannya memilih setiap huruf secara terpisah, Jika n-pengulangan diperbolehkan, memperbesar secara acak dengan n kali misalnyaCatatan: acak.sampel mencegah karakter reuse, mengalikan ukuran set karakter membuat beberapa pengulangan mungkin, tetapi mereka masih kurang mungkin kemudian mereka secara murni pilihan acak. Jika kita pergi untuk string dengan panjang 6, dan kita pilih 'X' sebagai karakter pertama, dalam pilihan contoh, peluang mendapatkan 'X' untuk kedua karakter yang sama seperti peluang mendapatkan 'X' sebagai karakter pertama. Di acak.contoh implementasi, peluang mendapatkan 'X' karena setiap karakter berikutnya hanya 6/7 kesempatan untuk mendapatkan ini sebagai karakter pertama
lowercase_str
adalah nilai acak seperti'cea8b32e00934aaea8c005a35d85a5c0'
uppercase_str
adalah'CEA8B32E00934AAEA8C005A35D85A5C0'
Lebih cepat, lebih mudah dan lebih fleksibel cara untuk melakukan ini adalah dengan menggunakan
strgen
modul (pip menginstal StringGenerator
).Menghasilkan 6 karakter string acak dengan huruf dan angka:
Dapatkan daftar unik:
Guarantee satu "khusus" karakter dalam string:
Acak HTML color:
dll.
Kita perlu menyadari bahwa ini:
mungkin tidak memiliki digit (atau karakter huruf besar) di dalamnya.
strgen
lebih cepat dalam pengembang-waktu dari setiap solusi di atas. Solusi dari Ignacio adalah yang tercepat run-time dan melakukan adalah jawaban yang tepat menggunakan Python Library Standar. Tapi anda tidak akan pernah menggunakannya dalam formulir itu. Anda akan ingin menggunakan SystemRandom (atau mundur jika tidak tersedia), pastikan diperlukan set karakter yang diwakili, menggunakan unicode (atau tidak), pastikan berturut-turut pemanggilan menghasilkan sebuah string unik, menggunakan subset dari salah satu string modul kelas karakter, dll. Ini semua membutuhkan banyak kode yang lebih dari pada jawaban yang diberikan. Berbagai upaya untuk menggeneralisasi solusi semua memiliki keterbatasan yang strgen memecahkan dengan lebih singkatnya dan daya ekspresif menggunakan template sederhana bahasa.It's di PyPI:
Disclosure: saya'm penulis strgen modul.
Dari Python 3.6 pada anda harus menggunakan
rahasia
modul bila yang anda butuhkan untuk menjadi cryptographically secure bukanrandom
modul (jika jawaban ini identik dengan salah satu dari @Ignacio Vazquez-Abrams):Satu catatan tambahan: daftar-pemahaman lebih dalam kasus
str.bergabung
daripada menggunakan generator ekspresi!Berdasarkan Tumpukan lain Overflow menjawab, Paling ringan cara untuk membuat sebuah string acak dan acak nomor heksadesimal, versi yang lebih baik dari jawaban yang diterima akan sama:
jauh lebih cepat.
Aku pikir tidak ada yang menjawab ini belum lol! Tapi, hei, di sini's saya sendiri pergi di itu:
Jika anda membutuhkan sebuah string acak daripada pseudo random satu, anda harus menggunakan
os.urandom
sebagai sumberMetode ini sedikit lebih cepat, dan sedikit lebih menjengkelkan, dari acak.pilihan() metode Ignacio diposting.
Ia mengambil keuntungan dari sifat pseudo-random algoritma, dan bank-bank di bitwise dan dan pergeseran yang cepat dari yang menghasilkan nomor acak baru untuk masing-masing karakter.
...membuat generator yang mengeluarkan 5 bit angka-angka pada suatu waktu 0..31 sampai tidak ada yang tersisa
...join() hasil dari generator nomor acak dengan tepat bit
Dengan Waktuhal, untuk 32-karakter string, waktu itu:
...tapi untuk 64 karakter string, randbits kehilangan keluar ;)
Saya mungkin akan tidak pernah menggunakan pendekatan ini dalam kode produksi kecuali aku benar-benar tidak menyukai rekan kerja saya.
edit: diperbarui sesuai dengan pertanyaan (huruf besar dan angka saja), dan menggunakan operator bitwise & dan >> bukan % dan //
I'd lakukan cara ini:
Atau hanya:
Menggunakan Numpy's acak.pilihan() fungsi
Dokumentasi di sini http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.random.choice.html
berikut logika masih menghasilkan 6 karakter sampel acak
Tidak perlu kalikan dengan 6
Kadang-kadang 0 (nol) & O (huruf O) dapat membingungkan. Jadi saya gunakan
Bagi anda yang menikmati fungsional python:
Ini menghasilkan waktu yang tidak terbatas [tak terbatas] iterator, bergabung dengan urutan acak, dengan terlebih dahulu menghasilkan waktu yang tidak terbatas urutan yang dipilih secara acak simbol dari pemberian renang, kemudian melanggar urutan ini suhu udara turun menjadi bagian-bagian yang kemudian bergabung, itu harus bekerja dengan urutan yang mendukung getitem, secara default hanya menghasilkan urutan acak dari alpha numerik huruf, meskipun anda dapat dengan mudah memodifikasi untuk menghasilkan hal-hal lain:
misalnya untuk menghasilkan random tupel digit:
jika anda don't ingin anda gunakan berikutnya untuk generasi anda hanya dapat membuatnya callable:
jika anda ingin menghasilkan urutan on the fly hanya mengatur bergabung dengan identitas.
Seperti orang lain telah disebutkan jika anda membutuhkan keamanan yang lebih kemudian menetapkan sesuai pilih fungsi:
default pemilih adalah
pilihan
yang mungkin pilih simbol yang sama beberapa kali untuk masing-masing potongan, jika bukan anda'd mau sama anggota yang dipilih paling banyak sekali untuk setiap chunk kemudian, salah satu kemungkinan penggunaan:kita menggunakan
sampel
sebagai pemilih, untuk melakukan pilihan lengkap, sehingga potongan yang benar-benar panjang 1, dan untuk bergabung dengan kami hanya dengan panggilannext
yang menjemput berikutnya benar-benar dihasilkan chunk, diberikan contoh ini tampaknya sedikit rumit dan itu adalah ...(1) Ini akan memberikan anda semua huruf dan angka:
(2) Jika anda kemudian ingin memasukkan huruf pada kunci anda, maka ini juga akan bekerja:
ini adalah mengambil Anurag Uniyal 's respon dan sesuatu yang saya telah bekerja pada diri saya sendiri.
Di sini panjang dari string yang dapat berubah dalam lingkaran saya.e for i in range(1,panjang) Ini adalah algoritma sederhana yang mudah dipahami. menggunakan daftar sehingga anda dapat membuang karakter yang anda tidak perlu.
Yang
acak.pilihan
fungsi mengambil sebuah entri acak dalam daftar. Anda juga dapat membuat sebuah daftar sehingga anda dapat menambahkan karakter dalamuntuk
pernyataan. Pada akhir str ['t', 'm', '2', 'J', 'U', 'Q', '0', '4', 'C', 'K'], tapistr = "".bergabung(str)
mengurus itu, meninggalkan anda dengan'tm2JUQ04CK'
.Harap ini membantu!