Random 如何使用SeedableRng生成随机数?

Random 如何使用SeedableRng生成随机数?,random,rust,Random,Rust,我有以下Rust代码,其最终目标是在给定公钥的情况下生成确定性用户名: 使用openssl::pkey::{pkey,Private}; 使用rand::{Rng,SeedableRng}; 使用std::convert::TryInto; 发布结构MyRng([u8;32]); MyRng的impl可种子RNG{ 类型Seed=[u8;32]; fn来自_seed(seed:Self::seed)->MyRng{ MyRng(种子) } } fn生成\u用户名(密钥对:&PKey){ 让公共_

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

使用openssl::pkey::{pkey,Private};
使用rand::{Rng,SeedableRng};
使用std::convert::TryInto;
发布结构MyRng([u8;32]);
MyRng的impl可种子RNG{
类型Seed=[u8;32];
fn来自_seed(seed:Self::seed)->MyRng{
MyRng(种子)
}
}
fn生成\u用户名(密钥对:&PKey){
让公共_字节:Vec=keypair.public_key_to_der().unwrap();
让公共_字节:[u8;32]=公共_字节。请将_放入()。展开();
设seeded\u rng:MyRng=SeedableRng::from\u seed(public\u字节);
设num=rand::thread\u rng().gen\u范围(0..32);
}
使用
rand::thread\u rng()
创建
ThreadRng
可以创建一个没有种子的随机数。如果我将最后一行更改为
seeded\u rng.gen\u range(0..32)
,则我被告知找不到方法,并且没有实现特征
rng
RngCore
。然而,我不确定如何实现这些特性


如何使用
[u8;32]
种子生成随机数?还有,我的代码有哪些地方可以改进?(例如,my是否需要创建自己的结构?

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

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

使用openssl::pkey::{pkey,Private};
使用rand::{rngs::StdRng,Rng,SeedableRng};
使用std::convert::TryInto;
fn生成\u用户名(密钥对:&PKey){
让公共_字节:Vec=keypair.public_key_to_der().unwrap();
让公共_字节:[u8;]=公共_字节。请尝试将_放入()。展开();
让mut seed_rng=StdRng::from_seed(public_字节);
设num=seeded_rng.gen_range(0..32);
}

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

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

使用openssl::pkey::{pkey,Private};
使用rand::{rngs::StdRng,Rng,SeedableRng};
使用std::convert::TryInto;
fn生成\u用户名(密钥对:&PKey){
让公共_字节:Vec=keypair.public_key_to_der().unwrap();
让公共_字节:[u8;]=公共_字节。请尝试将_放入()。展开();
让mut seed_rng=StdRng::from_seed(public_字节);
设num=seeded_rng.gen_range(0..32);
}

出于某种原因,我似乎无法再次编辑此内容,但在我提供的示例中,
[u8;]
应该是
[u8;32]
,或者可以省略类型以进行推断。出于某种原因,我似乎无法再次编辑此内容,但在我提供的示例中,
[u8;\u]
应该是
[u8;32]
,或者,可以省略该类型以进行推断。