gpt4 book ai didi

random - 是否可以使用任意长度的向量作为种子来创建RNG,而无需自己创建完整的RNG实现?

转载 作者:行者123 更新时间:2023-12-03 11:43:53 25 4
gpt4 key购买 nike

这段代码适用于长度为32的向量-但是,如果将32更改为其他数字,例如16或64,则将出现类型不匹配的错误:

use rand::{rngs::StdRng, Rng, SeedableRng};
use std::convert::TryInto;

fn generate_random(bytes: Vec<u8>) -> u32 {
let bytes: [u8; 32] = bytes.try_into().unwrap();
let mut seeded_rng = StdRng::from_seed(bytes);

seeded_rng.gen_range(0..32)
}
rand文档包括 an example for implementing SeedableRng for RNGs with large seeds,但这不是一个完整的工作示例,因此需要实现其余的RNG(即traits RngRngCore)才能获得有效的解决方案。
是否可以使用任意长度的向量作为种子来创建RNG,而无需自己创建完整的RNG实现,如果是这样,我该怎么做呢?

最佳答案

我找到了一种解决方案,其中涉及使用OpenSSL crate 首先对N长度向量进行散列,然后将所得散列用作随机种子:

use openssl::sha::Sha256;
use rand::{rngs::StdRng, Rng, SeedableRng};

fn generate_random(bytes: Vec<u8>) -> u32 {
let mut sha256 = Sha256::new();
sha256.update(&bytes);

let hash = sha256.finish();
let mut seeded_rng = StdRng::from_seed(hash);

seeded_rng.gen_range(0..32)
}
尽管使用此方法的真实熵仍然是32个字节,但它可以确保对部分种子字节的任何更改都会导致产生不同的结果RNG,这与截断向量不同。
任何采用任意长度的 u8切片并返回32字节 u8数组的哈希函数都可以代替 openssl::sha::Sha256来工作。

关于random - 是否可以使用任意长度的向量作为种子来创建RNG,而无需自己创建完整的RNG实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66242976/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com