Skip to content

Commit 368f774

Browse files
author
TheIronBorn
committed
switch gen_biguint to fill_bytes
1 parent 9309c8b commit 368f774

File tree

1 file changed

+9
-6
lines changed

1 file changed

+9
-6
lines changed

src/bigrand.rs

+9-6
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
33
use rand::prelude::*;
44
use rand::distributions::uniform::{SampleUniform, UniformSampler};
5+
use rand::AsByteSliceMut;
56

67
use BigInt;
78
use BigUint;
@@ -39,13 +40,15 @@ impl<R: Rng + ?Sized> RandBigInt for R {
3940
fn gen_biguint(&mut self, bit_size: usize) -> BigUint {
4041
use super::big_digit::BITS;
4142
let (digits, rem) = bit_size.div_rem(&BITS);
42-
let mut data = Vec::with_capacity(digits + 1);
43-
for _ in 0..digits {
44-
data.push(self.gen());
45-
}
43+
let mut data = vec![BigDigit::default(); digits + (rem > 0) as usize];
44+
// `fill_bytes` is faster than many `gen::<u32>` calls
45+
self.fill_bytes(data[..].as_byte_slice_mut());
46+
// Swap bytes per the `Rng::fill` source. This might be
47+
// unnecessary if reproducibility across architectures is not
48+
// desired.
49+
data.to_le();
4650
if rem > 0 {
47-
let final_digit: BigDigit = self.gen();
48-
data.push(final_digit >> (BITS - rem));
51+
data[digits] >>= BITS - rem;
4952
}
5053
BigUint::new(data)
5154
}

0 commit comments

Comments
 (0)