5.1.5. 从字母数字字符创建随机密码

rand-badge cat-os-badge

问题:

你想从一组字母数字生成一个随机值,比如创建随机密码。

解决方案:

在 rand crate 的分布类型中,包含一个字母数字样本,范围为 A-Z,a-z,0-9。因此我们可以使用字母数字样本,随机生成一个给定长度的 ASCII 字符串。

以下实例代码引用自开源书籍项目《Cookin’ with Rust》,笔者在其基础上稍作修改。

use rand::{thread_rng, Rng};
use rand::distributions::Alphanumeric;

fn main() {
    let rand_string: String = thread_rng()
        .sample_iter(&Alphanumeric)
        .take(30)
        .collect();

    println!("  随机密码: {}", rand_string);
}

代码第 1,2 行使用 use 关键字将相关模块引入作用域,其中 rand::distributions::Alphanumeric字母数字样本,范围为 A-Z,a-z,0-9

代码第 6,7 行使用 sample_iter 方法迭代从字母数字样本产生总长度为 30 的随机密码。

构建并运行后,结果大抵如下所示。

  随机密码: vVvYkJpQhiBbrB7rVNvzHpzXOrmO7K

注:你的运行结果值和笔者运行结果不一定相同。

讨论:

rand::distributions::Alphanumeric字母数字样本,范围限定为 A-Z,a-z,0-9,如果需要生成的随机值字符包括特殊字符,请参阅下一小节 5.1.6. 从用户定义字符创建随机密码