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
}
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 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 dict_size = dictionary.len();
@ -194,11 +198,11 @@ mod test {
let mut rng = AwsRng::new();
let dict = dict_alnum(32);
let gen0 = str_bytes(&mut rng, 0, &dict).unwrap();
let gen1 = str_bytes(&mut rng, 1, &dict).unwrap();
let gen27 = str_bytes(&mut rng, 27, &dict).unwrap();
let gen256 = str_bytes(&mut rng, 256, &dict).unwrap();
assert_ne!(str_bytes(&mut rng, 256, &dict).unwrap(), gen256);
let gen0 = str_bytes(&mut rng, 0, dict.iter().cloned()).unwrap();
let gen1 = str_bytes(&mut rng, 1, dict.iter().cloned()).unwrap();
let gen27 = str_bytes(&mut rng, 27, dict.iter().cloned()).unwrap();
let gen256 = str_bytes(&mut rng, 256, dict.iter().cloned()).unwrap();
assert_ne!(str_bytes(&mut rng, 256, dict.iter().cloned()).unwrap(), gen256);
// length
assert_eq!(gen0.len(), 0);
@ -222,7 +226,7 @@ mod test {
let mut rng = AwsRng::new();
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_dict_chars(&gen16, &dict);
@ -258,12 +262,12 @@ mod test {
let dict = dict_alnum(32);
assert_eq!(
str_bytes(&mut Hc128Rng::seed_from_u64(42), 256, &dict).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(),
str_bytes(&mut Hc128Rng::seed_from_u64(42), 256, dict.iter().cloned()).unwrap()
);
assert_ne!(
str_bytes(&mut Hc128Rng::seed_from_u64(42), 256, &dict).unwrap(),
str_bytes(&mut Hc128Rng::seed_from_u64(43), 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.iter().cloned()).unwrap()
);
}

View file

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