智能Python随机十六进制在Rust?

toe95027  于 2023-03-23  发布在  Python
关注(0)|答案(2)|浏览(160)

Python有一个非常方便的方法来获得加密安全的随机十六进制;secrets.token_hex(n)
所以通过运行secrets.token_hex(8)你得到16个十六进制,secrets.token_hex(12)得到24个十六进制等等。基本上没有上限。括号中的数字是以字节为单位的。
我的问题是,最近开始学习Rust,是否有类似的智能方法来获得非常高的随机十六进制输出?
在Python中:

import secrets

for x in range(1):
    xxx = secrets.token_hex(8)
x6yk4ghg

x6yk4ghg1#

token_hex实际上就是token_bytes的十六进制编码,这就是为什么要指定字节数:

def token_hex(nbytes=None):
    return binascii.hexlify(token_bytes(nbytes)).decode('ascii')

因此,虽然 rust 没有这样做的开箱即用(更不用说内置)的解决方案很简单:生成随机字节,然后对其进行十六进制编码。
有趣的是,十六进制编码是这两种编码中更令人讨厌的一种(无论如何在操场上),因为&[u8]没有实现LowerHex,但操场上既没有hex也没有rustc_serialize(我相信这是两种最流行的十六进制编码,if you don't want to hand-roll it)。
不管怎样,

use rand::RngCore;
use rustc_serialize::hex::ToHex;

fn main() {
    // compile-time length, use `vec![0;len]` for runtime
    let mut bytes = [0; 16];
    rand::thread_rng().fill_bytes(&mut bytes);
    // demo-ing both crates, either works
    println!("{}", hex::encode(&bytes));
    println!("{}", bytes.to_hex());
}

对于单表达式版本,您可以使用Rng::gen,但我认为它不适用于运行时大小,并且我认为它看起来也不太好:

use rand::Rng;

fn main() {
    println!("{}", hex::encode(&rand::thread_rng().gen::<[u8; 16]>()));
}
rjzwgtxy

rjzwgtxy2#

这似乎是一个解决方案。只要改变16所需的十六进制数。32将给予64十六进制。

use rand::RngCore;
//use rustc_serialize::hex::ToHex;

fn main() {
    // compile-time length, use `vec![0;len]` for runtime
    let mut bytes = [0; 16];
    rand::thread_rng().fill_bytes(&mut bytes);
    println!("{}", hex::encode(&bytes));
    //println!("{}", bytes.to_hex());
}

相关问题