Как создать случайную строку путем выборки из буквенно-цифровых символов?
Я попытался скомпилировать следующий код:
extern crate rand; // 0.6
use rand::Rng;
fn main() {
rand::thread_rng()
.gen_ascii_chars()
.take(10)
.collect::<String>();
}
но cargo build
говорит:
warning: unused import: `rand::Rng`
--> src/main.rs:2:5
|
2 | use rand::Rng;
| ^^^^^^^^^
|
= note: #[warn(unused_imports)] on by default
error[E0599]: no method named `gen_ascii_chars` found for type `rand::prelude::ThreadRng` in the current scope
--> src/main.rs:6:10
|
6 | .gen_ascii_chars()
| ^^^^^^^^^^^^^^^
Компилятор Rust просит меня удалить use rand::Rng;
пункт, в то же время жалуясь, что нет gen_ascii_chars
метод. Я бы ожидал, что Rust просто использовать rand::Rng
черта, а не предоставлять такие противоречивые сообщения об ошибках. Как я могу пойти дальше отсюда?
4 ответа
Как объяснено в ранде 0.5.0 документации gen_ascii_chars
устарела.
Начиная с версии 0.6.0 код должен быть:
extern crate rand;
use rand::Rng;
use rand::distributions::Alphanumeric;
fn main() {
rand::thread_rng().sample_iter(&Alphanumeric).take(10).collect::<String>();
}
С введением rand 0.8.4,rand
теперь содержитDistString
который содержит более эффективный метод выборки случайной буквенно-цифровой строки. Пример из ранд-документов:
use rand::distributions::{Alphanumeric, DistString};
let string = Alphanumeric.sample_string(&mut rand::thread_rng(), 16);
println!("{}", string);
Пример с пользовательской кодировкой иrand
ящик:
use rand::Rng;
use std::iter;
fn generate(len: usize) -> String {
const CHARSET: &[u8] = b"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
let mut rng = rand::thread_rng();
let one_char = || CHARSET[rng.gen_range(0..CHARSET.len())] as char;
iter::repeat_with(one_char).take(len).collect()
}
Вы можете использовать крейт случайных строк с вашей кодировкой. Вы можете установить его, включив
random-string
библиотека в вашем
Cargo.toml
.
Взгляните на пример:
// Import generate function
use random_string::generate;
// Your custom charset
let charset = "abcdefghijklmnopqrstuvwxyz";
// Syntax:
// random_string::generate(length, your_charset);
// Usage:
println!("{}", generate(6, charset));