fix(controller/generator)!: take iterator for chars to reduce memory overhead

This commit is contained in:
spushk 2026-05-16 10:30:53 +05:00 • committed by spushk
commit 69ccd48c3b
Signed by: spushk
GPG key ID: 7797B761E105E8AA
2 changed files with 17 additions and 14 deletions

View file

@ -30,10 +30,14 @@ pub fn bytes<G: CryptoRng>(rng: &mut G, size: usize) -> Vec<u8> {
buf buf
} }
pub fn str_bytes<G: CryptoRng>(rng: &mut G, length: usize, dictionary: &[char]) -> Result<Vec<u8>, GeneratorErr> { pub fn str_bytes<G: CryptoRng>(
rng: &mut G,
length: usize,
dictionary: impl Iterator<Item = char>,
) -> Result<Vec<u8>, GeneratorErr> {
let mut buf = String::with_capacity(length); let mut buf = String::with_capacity(length);
let dictionary = Zeroizing::new(dictionary.iter().unique().cloned().collect::<Vec<char>>()); let dictionary = Zeroizing::new(dictionary.unique().collect::<Vec<char>>());
let distribution = rand::distr::slice::Choose::new(&dictionary).map_err(|_| GeneratorErr::EmptyDistribution)?; let distribution = rand::distr::slice::Choose::new(&dictionary).map_err(|_| GeneratorErr::EmptyDistribution)?;
let dict_size = dictionary.len(); let dict_size = dictionary.len();
@ -194,11 +198,11 @@ mod test {
let mut rng = AwsRng::new(); let mut rng = AwsRng::new();
let dict = dict_alnum(32); let dict = dict_alnum(32);
let gen0 = str_bytes(&mut rng, 0, &dict).unwrap(); let gen0 = str_bytes(&mut rng, 0, dict.iter().cloned()).unwrap();
let gen1 = str_bytes(&mut rng, 1, &dict).unwrap(); let gen1 = str_bytes(&mut rng, 1, dict.iter().cloned()).unwrap();
let gen27 = str_bytes(&mut rng, 27, &dict).unwrap(); let gen27 = str_bytes(&mut rng, 27, dict.iter().cloned()).unwrap();
let gen256 = str_bytes(&mut rng, 256, &dict).unwrap(); let gen256 = str_bytes(&mut rng, 256, dict.iter().cloned()).unwrap();
assert_ne!(str_bytes(&mut rng, 256, &dict).unwrap(), gen256); assert_ne!(str_bytes(&mut rng, 256, dict.iter().cloned()).unwrap(), gen256);
// length // length
assert_eq!(gen0.len(), 0); assert_eq!(gen0.len(), 0);
@ -222,7 +226,7 @@ mod test {
let mut rng = AwsRng::new(); let mut rng = AwsRng::new();
let dict: Vec<char> = dict_alnum(3); let dict: Vec<char> = dict_alnum(3);
let gen16 = str_bytes(&mut rng, 16, &dict).unwrap(); let gen16 = str_bytes(&mut rng, 16, dict.iter().cloned()).unwrap();
assert_eq!(gen16.len(), 16); assert_eq!(gen16.len(), 16);
assert_dict_chars(&gen16, &dict); assert_dict_chars(&gen16, &dict);
@ -258,12 +262,12 @@ mod test {
let dict = dict_alnum(32); let dict = dict_alnum(32);
assert_eq!( assert_eq!(
str_bytes(&mut Hc128Rng::seed_from_u64(42), 256, &dict).unwrap(), str_bytes(&mut Hc128Rng::seed_from_u64(42), 256, dict.iter().cloned()).unwrap(),
str_bytes(&mut Hc128Rng::seed_from_u64(42), 256, &dict).unwrap() str_bytes(&mut Hc128Rng::seed_from_u64(42), 256, dict.iter().cloned()).unwrap()
); );
assert_ne!( assert_ne!(
str_bytes(&mut Hc128Rng::seed_from_u64(42), 256, &dict).unwrap(), str_bytes(&mut Hc128Rng::seed_from_u64(42), 256, dict.iter().cloned()).unwrap(),
str_bytes(&mut Hc128Rng::seed_from_u64(43), 256, &dict).unwrap() str_bytes(&mut Hc128Rng::seed_from_u64(43), 256, dict.iter().cloned()).unwrap()
); );
} }

View file

@ -1,5 +1,4 @@
#![feature(sync_nonpoison, nonpoison_rwlock)]
pub mod generator; pub mod generator;
pub mod reporting; pub mod reporting;
pub mod resource;
pub mod utils; pub mod utils;