11// Copyright (c) Zefchain Labs, Inc.
22// SPDX-License-Identifier: Apache-2.0
33
4- use rand:: { Rng , SeedableRng } ;
4+ #[ cfg( target_arch = "wasm32" ) ]
5+ use std:: sync:: { Mutex , MutexGuard , OnceLock } ;
6+
7+ use rand:: { rngs:: SmallRng , Rng , SeedableRng } ;
58
69// The following seed is chosen to have equal numbers of 1s and 0s, as advised by
710// https://docs.rs/rand/latest/rand/rngs/struct.SmallRng.html
811// Specifically, it's "01" × 32 in binary
912const RNG_SEED : u64 = 6148914691236517205 ;
1013
1114/// A deterministic RNG.
12- pub type DeterministicRng = rand :: rngs :: SmallRng ;
15+ pub type DeterministicRng = SmallRng ;
1316
1417/// A RNG that is non-deterministic if the platform supports it.
1518pub struct NonDeterministicRng (
16- #[ cfg( target_arch = "wasm32" ) ] std :: sync :: MutexGuard < ' static , DeterministicRng > ,
17- #[ cfg( not( target_arch = "wasm32" ) ) ] rand:: rngs:: ThreadRng ,
19+ #[ cfg( target_arch = "wasm32" ) ] pub MutexGuard < ' static , DeterministicRng > ,
20+ #[ cfg( not( target_arch = "wasm32" ) ) ] pub rand:: rngs:: ThreadRng ,
1821) ;
1922
20- impl NonDeterministicRng {
21- /// Access the internal RNG.
22- pub fn rng_mut ( & mut self ) -> & mut impl Rng {
23- #[ cfg( target_arch = "wasm32" ) ]
24- {
25- & mut * self . 0
26- }
27- #[ cfg( not( target_arch = "wasm32" ) ) ]
28- {
29- & mut self . 0
30- }
31- }
32- }
33-
3423/// Returns a deterministic RNG for testing.
3524pub fn make_deterministic_rng ( ) -> DeterministicRng {
36- rand :: rngs :: SmallRng :: seed_from_u64 ( RNG_SEED )
25+ SmallRng :: seed_from_u64 ( RNG_SEED )
3726}
3827
3928/// Returns a non-deterministic RNG where supported.
4029pub fn make_nondeterministic_rng ( ) -> NonDeterministicRng {
4130 #[ cfg( target_arch = "wasm32" ) ]
4231 {
43- use std:: sync:: { Mutex , OnceLock } ;
44-
45- use rand:: rngs:: SmallRng ;
46-
4732 static RNG : OnceLock < Mutex < SmallRng > > = OnceLock :: new ( ) ;
4833 NonDeterministicRng (
4934 RNG . get_or_init ( || Mutex :: new ( make_deterministic_rng ( ) ) )
@@ -62,9 +47,7 @@ pub fn make_nondeterministic_rng() -> NonDeterministicRng {
6247pub fn generate_random_alphanumeric_string ( length : usize , charset : & [ u8 ] ) -> String {
6348 ( 0 ..length)
6449 . map ( |_| {
65- let random_index = make_nondeterministic_rng ( )
66- . rng_mut ( )
67- . gen_range ( 0 ..charset. len ( ) ) ;
50+ let random_index = make_nondeterministic_rng ( ) . 0 . gen_range ( 0 ..charset. len ( ) ) ;
6851 charset[ random_index] as char
6952 } )
7053 . collect ( )
0 commit comments