我有以下 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)那么我会被告知未找到方法,并且特征Rng和RngCore未实现。然而,我不确定如何去实现这些特征。
如何使用 的种子生成随机数[u8; 32]?另外,我的代码是否有任何可以改进的地方?(例如,我有必要创建自己的结构吗?)
您需要使用具体的 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)