Random 在Rust中生成安全随机数
我可以看出我必须这样导入:Random 在Rust中生成安全随机数,random,rust,rust-obsolete,Random,Rust,Rust Obsolete,我可以看出我必须这样导入: use std::io::IoResult; use std::num::{Int, ToPrimitive}; use std::rand::{OsRng, Rng}; 然后创建一个新的OsRng实例,并尝试从中生成一个新的u32 int fn main() { let mut rng = OsRng::new(); let num:u32 = rng.next_u32(); println!("{}",num); } 但是,我得到的错误类型co
use std::io::IoResult;
use std::num::{Int, ToPrimitive};
use std::rand::{OsRng, Rng};
然后创建一个新的OsRng实例,并尝试从中生成一个新的u32 int
fn main() {
let mut rng = OsRng::new();
let num:u32 = rng.next_u32();
println!("{}",num);
}
但是,我得到的错误类型core::result::result
在名为next\u u32
但是rust文档清楚地说明了有一个函数next\u u32
我缺少什么?您这里的问题是
OsRng::new()
不返回OsRng
实例,而是返回IoResult
。因为程序可能无法获取OS随机数生成器
一个使用示例是:
use std::rand::{OsRng, Rng};
fn main() {
let mut rng = match OsRng::new() {
Ok(g) => g,
Err(e) => panic!("Failed to obtain OS RNG: {}", e)
};
let num:u32 = rng.next_u32();
println!("{}",num);
}
对Rust生成安全随机数的搜索返回了这个问题,但作为对当前答案的评论,Rust不再在标准库中包含随机数生成。以下是一个更新的示例(截至2017年1月): 货舱 梅因 有用的参考资料:
否则,使用原始答案中的代码会出现以下错误:
error[E0432]: unresolved import `std::rand::Rng`
--> src/main.rs:5:24
|
5 | use std::rand::{OsRng, Rng};
| ^^^ no `Rng` in `std::rand`
error: module `rand` is private
--> src/main.rs:5:17
|
5 | use std::rand::{OsRng, Rng};
| ^^^^^
error: module `rand` is private
--> src/main.rs:5:24
|
5 | use std::rand::{OsRng, Rng};
| ^^^
error: aborting due to 3 previous errors
仅供参考:API在最新版本中已更改,请参阅 TL;DR版本,使用
fn获取\u random\u buf()->结果{
设mut buf=[0u8;32];
getrandom::getrandom(&mutbuf)?;
Ok(buf)
}
正在尝试!(OsRng::new())是否与该匹配语句类似**也许不是,我只是试过了。我犯了一个错误。有什么原因不能直接导入use std::rand:OsRng而不是{OsRng,Rng}?@leshow使用试试!()
您需要调用函数OsRng::new()
来返回IoResult
(这将导致在出现错误时提前返回)。它实际上是一个非常简单的宏:@leshow您需要导入traitRng
,才能在OsRng
上使用它的实现。在您的例子中,方法next\u u32()
。问题不在于OsRng::new()
是否返回IoResult
,而在于调用它的函数。因为作为尝试代码>扩展为返回错误(..)
,您的函数必须与之兼容。对于现代锈菌,请使用兰德:{OsRng,Rng}
和兰德板条箱。
extern crate rand;
use rand::{OsRng, Rng};
fn main() {
let mut rng = OsRng::new().expect("Error opening random number generator");
println!("Random: {}", rng.next_u32());
}
error[E0432]: unresolved import `std::rand::Rng`
--> src/main.rs:5:24
|
5 | use std::rand::{OsRng, Rng};
| ^^^ no `Rng` in `std::rand`
error: module `rand` is private
--> src/main.rs:5:17
|
5 | use std::rand::{OsRng, Rng};
| ^^^^^
error: module `rand` is private
--> src/main.rs:5:24
|
5 | use std::rand::{OsRng, Rng};
| ^^^
error: aborting due to 3 previous errors
fn get_random_buf() -> Result<[u8; 32], getrandom::Error> {
let mut buf = [0u8; 32];
getrandom::getrandom(&mut buf)?;
Ok(buf)
}