Bagaimana saya bisa menghasilkan string alfanumerik acak di Swift?
208
Swift 4.2 Update
Swift 4.2 memperkenalkan peningkatan besar dalam berurusan dengan nilai dan elemen acak. Anda dapat membaca lebih lanjut tentang peningkatan tersebut di sini . Berikut ini metode yang direduksi menjadi beberapa baris:
func randomString(length: Int) -> String {
let letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
return String((0..<length).map{ _ in letters.randomElement()! })
}
Pembaruan Swift 3.0
func randomString(length: Int) -> String {
let letters : NSString = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
let len = UInt32(letters.length)
var randomString = ""
for _ in 0 ..< length {
let rand = arc4random_uniform(len)
var nextChar = letters.character(at: Int(rand))
randomString += NSString(characters: &nextChar, length: 1) as String
}
return randomString
}
Jawaban asli:
func randomStringWithLength (len : Int) -> NSString {
let letters : NSString = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
var randomString : NSMutableString = NSMutableString(capacity: len)
for (var i=0; i < len; i++){
var length = UInt32 (letters.length)
var rand = arc4random_uniform(length)
randomString.appendFormat("%C", letters.characterAtIndex(Int(rand)))
}
return randomString
}
Inilah solusi yang siap digunakan dalam sintaks Swiftier . Anda cukup menyalin dan menempelkannya:
Jika Anda lebih suka Kerangka yang juga memiliki beberapa fitur yang lebih berguna maka jangan ragu untuk checkout proyek saya HandySwift . Ini juga termasuk solusi yang bagus untuk string alfanumerik acak :
sumber
Anda dapat menggunakannya juga dengan cara berikut:
Penggunaan sederhana:
Sintaks Swift 3:
Sintaks Swift 4:
sumber
Cepat:
sumber
Dengan Swift 4.2, taruhan terbaik Anda adalah membuat string dengan karakter yang Anda inginkan dan kemudian menggunakan randomElement untuk memilih setiap karakter:
Saya lebih detail tentang perubahan ini di sini .
sumber
DIPERBARUI 2019.
Dalam kasus yang tidak biasa itu
masalah kinerja.
Berikut adalah fungsi yang sangat jelas yang menyimpan :
Ini untuk saat Anda memiliki set karakter yang telah diperbaiki .
Tip berguna:
Perhatikan bahwa "abcdefghjklmnpqrstuvwxyz12345789" menghindari karakter 'buruk'
Tidak ada 0, o, O, i, dll ... karakter yang sering membingungkan manusia.
Ini sering dilakukan untuk kode pemesanan dan kode serupa yang akan digunakan pelanggan manusia.
sumber
repeating:count:
.Sederhana dan Cepat - UUID (). UuidString
Swift 3.0
EDIT
Tolong jangan bingung dengan
UIDevice.current.identifierForVendor?.uuidString
itu tidak akan memberikan nilai acak.sumber
Versi Swift 2.2
Pada dasarnya panggil metode ini yang akan menghasilkan string acak panjang bilangan bulat yang diserahkan ke fungsi. Untuk mengubah karakter yang mungkin, cukup edit string karakterString. Mendukung karakter unicode juga.
https://gist.github.com/gingofthesouth/54bea667b28a815b2fe33a4da986e327
sumber
EXC_BAD_INSTRUCTION
let random = randomString(16)
. EXC hanya di perangkat nyata dan saya tidak melihatnya di simulator dan itu terputus-putus di perangkat.random % count
tidak tidak (selalu) membuat distribusi seragam. Jika ini relevan bagi Anda, lihat jawaban lain yang digunakanarc4random_uniform()
.Untuk orang-orang yang tidak ingin mengetikkan seluruh rangkaian karakter:
sumber
untuk Swift 3.0
sumber
Acak murni Swift
String
dari mana sajaCharacterSet
.Pemakaian:
CharacterSet.alphanumerics.randomString(length: 100)
The
characters()
fungsi implementasi saya tercepat dikenal .sumber
sumber
Saya bahkan lebih Swift-IER pelaksanaan pertanyaan:
sumber
Loop gratis, meskipun terbatas hingga 43 karakter. Jika Anda membutuhkan lebih banyak, itu dapat dimodifikasi. Pendekatan ini memiliki dua keunggulan dibandingkan hanya menggunakan UUID:
UUID()
hanya menghasilkan huruf besarUUID
paling panjang 36 karakter (termasuk 4 tanda hubung), tetapi hanya 32 karakter yang panjangnya. Jika Anda membutuhkan sesuatu yang lebih lama, atau tidak ingin menyertakan tanda hubung, gunakanbase64EncodedString
pegangan iniJuga, fungsi ini memanfaatkan a
UInt
untuk menghindari angka negatif.Menyebutnya secara berulang untuk memeriksa output:
Yang menghasilkan:
sumber
Swift 5.0
sumber
Masalah dengan respons terhadap "Saya perlu string acak" (dalam bahasa apa pun) praktis setiap solusi menggunakan spesifikasi primer cacat panjang string . Pertanyaan-pertanyaan itu sendiri jarang mengungkapkan mengapa string acak diperlukan, tetapi saya akan menantang Anda jarang membutuhkan string acak panjang, katakan 8. Apa yang Anda selalu butuhkan adalah sejumlah string unik , misalnya, untuk digunakan sebagai pengidentifikasi untuk beberapa tujuan.
Ada dua cara utama untuk mendapatkan string unik yang unik : deterministik (yang tidak acak) dan menyimpan / membandingkan (yang memberatkan). Apa yang kita lakukan? Kami menyerah hantu. Kami pergi dengan keunikan probabilistik sebagai gantinya. Artinya, kami menerima bahwa ada beberapa (betapapun kecil) risiko bahwa string kami tidak akan menjadi unik. Di sinilah pemahaman probabilitas tabrakan dan entropi sangat membantu.
Jadi saya akan ulangi kebutuhan yang tidak berubah sebagai membutuhkan sejumlah string dengan risiko pengulangan yang kecil. Sebagai contoh nyata, katakanlah Anda ingin menghasilkan potensi 5 juta ID. Anda tidak ingin menyimpan dan membandingkan setiap string baru, dan Anda ingin mereka menjadi acak, sehingga Anda menerima risiko berulang. Sebagai contoh, katakanlah risiko kurang dari 1 dalam satu triliun peluang berulang. Jadi berapa panjang tali yang Anda butuhkan? Nah, pertanyaan itu tidak ditentukan karena tergantung pada karakter yang digunakan. Tapi yang lebih penting, ini salah arah. Yang Anda butuhkan adalah spesifikasi entropi string, bukan panjangnya. Entropi dapat secara langsung terkait dengan probabilitas pengulangan dalam sejumlah string. Panjang string tidak bisa.
Dan di sinilah perpustakaan seperti EntropyString dapat membantu. Untuk menghasilkan ID acak yang memiliki peluang kurang dari 1 dalam satu triliun untuk diulang dalam 5 juta string menggunakan
EntropyString
:EntropyString
menggunakan set karakter dengan 32 karakter secara default. Ada set karakter yang telah ditentukan sebelumnya, dan Anda dapat menentukan karakter Anda sendiri juga. Misalnya, membuat ID dengan entropi yang sama seperti di atas tetapi menggunakan karakter hex:Perhatikan perbedaan panjang string karena perbedaan jumlah karakter dalam set karakter yang digunakan. Risiko pengulangan dalam jumlah string potensial yang ditentukan adalah sama. Panjang string tidak. Dan yang terbaik dari semuanya, risiko pengulangan dan potensi jumlah string adalah eksplisit. Tidak perlu lagi menebak dengan panjang tali.
sumber
Jika string acak Anda harus acak-aman, gunakan ini:
sumber
Jika Anda hanya memerlukan pengidentifikasi unik,
UUID().uuidString
dapat melayani tujuan Anda.sumber
Diperbarui untuk Swift 4. Gunakan variabel simpanan yang disimpan pada ekstensi kelas. Ini hanya dihitung sekali.
sumber
SWIFT 4
Menggunakan RandomNumberGenerator untuk kinerja yang lebih baik sebagai rekomendasi Apple
Penggunaan:
String.random(20)
Hasil:CifkNZ9wy9jBOT0KJtV4
sumber
Ini adalah solusi Swift -est yang bisa saya buat. Swift 3.0
sumber
sumber