如何通过从字母数字字符中采样来创建随机字符串?

M. *_*aut 3 random alphanumeric rust

我试图编译以下代码:

extern crate rand; // 0.6
use rand::Rng;

fn main() {
    rand::thread_rng()
        .gen_ascii_chars()
        .take(10)
        .collect::<String>();
}
Run Code Online (Sandbox Code Playgroud)

cargo build说:

extern crate rand; // 0.6
use rand::Rng;

fn main() {
    rand::thread_rng()
        .gen_ascii_chars()
        .take(10)
        .collect::<String>();
}
Run Code Online (Sandbox Code Playgroud)

Rust编译器要求我删除该use rand::Rng;子句,同时抱怨没有gen_ascii_chars方法。我希望Rust只使用rand::Rng特征,而不会提供这种矛盾的错误消息。我如何才能从这里走得更远?

小智 29

随着rand 0.8.4的引入,rand现在 containsDistString包含一种更有效的随机字母数字字符串采样方法。rand 文档中的示例:

use rand::distributions::{Alphanumeric, DistString};

let string = Alphanumeric.sample_string(&mut rand::thread_rng(), 16);
println!("{}", string);
Run Code Online (Sandbox Code Playgroud)

  • 这有效,谢谢!游乐场:https://play.rust-lang.org/?version=stable&amp;mode=debug&amp;edition=2021&amp;gist=b49c143c033c38cdf7575f7a0c609204 (2认同)

M. *_*aut 6

rand 0.5.0 gen_ascii_chars中所述,不推荐使用docs

从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>(); 
}
Run Code Online (Sandbox Code Playgroud)

  • “字母数字”不等于“ascii”。```ascii``` 包括 ```!@#$%^&amp;*(){}[]:;"'&lt;&gt;?,./|\-_+=`` 等。 (2认同)

Den*_*din 5

具有自定义字符集和板条箱的示例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()
}
Run Code Online (Sandbox Code Playgroud)