如何使用 SeedableRng 生成随机数?

Dav*_*ley 2 random rust

我有以下 Rust 代码,其最终目标是在给定公钥的情况下生成确定性用户名:

use openssl::pkey::{PKey, Private};
use rand::{Rng, SeedableRng};
use std::convert::TryInto;

pub struct MyRng([u8; 32]);

impl SeedableRng for MyRng {
    type Seed = [u8; 32];

    fn from_seed(seed: Self::Seed) -> MyRng {
        MyRng(seed)
    }
}

fn generate_username(keypair: &PKey<Private>) {
    let public_bytes: Vec<u8> = keypair.public_key_to_der().unwrap();
    let public_bytes: [u8; 32] = public_bytes.try_into().unwrap();
    let seeded_rng: MyRng = SeedableRng::from_seed(public_bytes);

    let num = rand::thread_rng().gen_range(0..32);
}
Run Code Online (Sandbox Code Playgroud)

使用rand::thread_rng()创建 aThreadRng允许我创建一个没有种子的随机数。如果我将最后一行更改为,seeded_rng.gen_range(0..32)那么我会被告知未找到方法,并且特征RngRngCore未实现。然而,我不确定如何去实现这些特征。

如何使用 的种子生成随机数[u8; 32]?另外,我的代码是否有任何可以改进的地方?(例如,我有必要创建自己的结构吗?)

HHK*_*HHK 6

您需要使用具体的 Rng 实现。如果您不想添加更多依赖项,只需导入rand::rngs::StdRng并使用StdRng::from_seed(...)并删除您的MyRng结构。

您的代码现在应该如下所示:

use openssl::pkey::{PKey, Private};
use rand::{rngs::StdRng, Rng, SeedableRng};
use std::convert::TryInto;

fn generate_username(keypair: &PKey<Private>) {
    let public_bytes: Vec<u8> = keypair.public_key_to_der().unwrap();
    let public_bytes: [u8; _] = public_bytes.try_into().unwrap();
    let mut seeded_rng = StdRng::from_seed(public_bytes);

    let num = seeded_rng.gen_range(0..32);
}
Run Code Online (Sandbox Code Playgroud)