fix(controller/generator)!: take iterator for chars to reduce memory overhead
This commit is contained in:
parent
e357f87b43
commit
69ccd48c3b
2 changed files with 17 additions and 14 deletions
|
|
@ -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()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue