Random 在不创建整个RNG实现的情况下,是否可以使用任意长度的向量作为种子来创建RNG?

Random 在不创建整个RNG实现的情况下,是否可以使用任意长度的向量作为种子来创建RNG?,random,rust,Random,Rust,此代码适用于精确长度为32的向量-但是,如果将32更改为其他数字,如16或64,则存在不匹配的类型错误: 使用rand:{rngs::StdRng,Rng,SeedableRng}; 使用std::convert::TryInto; fn生成_随机(字节:Vec)->u32{ let bytes:[u8;32]=字节。请将_放入()中。展开(); 让mut seed_rng=StdRng::from_seed(字节); 种子根范围(0..32) } rand文档包括,但这不是一个完整的工作示例

此代码适用于精确长度为32的向量-但是,如果将32更改为其他数字,如16或64,则存在不匹配的类型错误:

使用rand:{rngs::StdRng,Rng,SeedableRng};
使用std::convert::TryInto;
fn生成_随机(字节:Vec)->u32{
let bytes:[u8;32]=字节。请将_放入()中。展开();
让mut seed_rng=StdRng::from_seed(字节);
种子根范围(0..32)
}
rand
文档包括,但这不是一个完整的工作示例,需要实现RNG的其余部分(即traits
RNG
RngCore
)以获得工作解决方案


是否可以使用任意长度的向量作为种子来创建RNG,而不必自己创建整个RNG实现,如果可以,我该怎么做?

我找到了一个解决方案,其中包括使用OpenSSL板条箱首先对N长度向量进行散列,然后将生成的散列用作随机种子:

使用openssl::sha::Sha256;
使用rand::{rngs::StdRng,Rng,SeedableRng};
fn生成_随机(字节:Vec)->u32{
让mut sha256=sha256::new();
sha256.update(&bytes);
让hash=sha256.finish();
让mut seed_rng=StdRng::from_seed(散列);
种子根范围(0..32)
}
尽管使用此方法时,真正的熵仍然是32字节,但它确保了对部分种子字节的任何更改都会导致不同的结果RNG,这与截断向量不同


任何采用任意长度
u8
切片并返回32字节
u8
数组的哈希函数也可以代替
openssl::sha::Sha256

字节。调整大小(32,0)
?这会起作用,但在长度大于32字节的情况下会失去熵,但是如果你有超过32字节的熵,rng无论如何都不能利用它。您应该详细说明使用任意字节对rng进行种子设定所期望的结果。如果这是针对一个游戏或某些东西,其中字节表示用户可生成的唯一代码,那么在将其提供给rng之前,您可能应该将其哈希为固定大小。最终目标是确定地生成一个用户名,考虑到公钥的字节数-这是我最后一个问题的后续问题:我知道StdRng可能无法使用超过32字节的熵,但在这种情况下,我认为最好使用能够这样做的RNG,而不是只使用一些可能导致冲突的公钥字节