@@ -507,7 +507,6 @@ macro_rules! impl_tests {
507507 mod $modname {
508508 use super :: * ;
509509 use alloc:: format;
510- use rand:: { rngs:: StdRng , Rng , SeedableRng } ;
511510
512511 trait Seeded : BuildHasher {
513512 fn seeded( seed: & [ u8 ; 16 ] ) -> Self ;
@@ -518,14 +517,14 @@ macro_rules! impl_tests {
518517 }
519518 }
520519
521- const TRIALS : usize = 1_000_000 ;
520+ const TRIALS : usize = 10_000_000 ;
522521
523522 fn false_pos_rate<H : BuildHasher >( filter: & $name<H >) -> f64 {
524523 let mut total = 0 ;
525524 let mut false_positives = 0 ;
526525 for x in non_member_nums( ) {
527526 total += 1 ;
528- false_positives += filter. contains ( & x) as usize ;
527+ false_positives += filter. contains_hash ( x) as usize ;
529528 }
530529 ( false_positives as f64 ) / ( total as f64 )
531530 }
@@ -535,12 +534,12 @@ macro_rules! impl_tests {
535534 }
536535
537536 fn non_member_nums( ) -> impl Iterator <Item = u64 > {
538- random_numbers( TRIALS , 7 ) . map( |x| x + u32 :: MAX as u64 )
537+ random_numbers( TRIALS , 7 ) . map( |x| x + ( u64 :: MAX >> 1 ) )
539538 }
540539
541540 fn random_numbers( num: usize , seed: u64 ) -> impl Iterator <Item = u64 > {
542- let mut rng = StdRng :: seed_from_u64 ( seed) ;
543- ( 0 ..=num) . map( move |_| rng. random :: < u32 > ( ) as u64 )
541+ let mut rng = fastrand :: Rng :: with_seed ( seed) ;
542+ ( 0 ..=num) . map( move |_| rng. u64 ( 0 .. ( u64 :: MAX >> 1 ) ) )
544543 }
545544
546545 #[ test]
@@ -569,18 +568,25 @@ macro_rules! impl_tests {
569568
570569 #[ test]
571570 fn target_fp_is_accurate( ) {
572- let thresh = 2.0f64 ;
573- for mag in 1 ..=6 {
574- let fp = 1.0f64 / 10u64 . pow( mag) as f64 ;
575- for num_items_mag in 1 ..7 {
571+ // actual false pos is at most twice as high as expected
572+ // this is slightly higher to account for random variance and limited time to sample false pos rate.
573+ let thresh = 1.0f64 ;
574+
575+ // fp: 10%, 1%, 0.1%, etc
576+ for fp_mag in 1 ..=7 {
577+ let fp = 1.0f64 / 10u64 . pow( fp_mag) as f64 ;
578+
579+ // Expected items: 10, 100, 1000, etc
580+ for num_items_mag in 3 ..8 {
576581 let num_items = 10usize . pow( num_items_mag) ;
577582 let mut filter = $name:: new_with_false_pos( fp)
578583 . seed( & 42 )
579584 . expected_items( num_items) ;
580585 filter. extend( member_nums( num_items) ) ;
581586 let sample_fp = false_pos_rate( & filter) ;
582- let err = ( fp - sample_fp) . abs( ) / fp;
583- assert!( sample_fp < fp || err < thresh, "err {err:}, thresh {thresh:}, num_items: {num_items:}, fp: {fp:}, sample fp: {sample_fp:}" ) ;
587+ let err = ( sample_fp - fp) / fp;
588+ let size_bits = filter. num_bits( ) ;
589+ assert!( sample_fp < fp || err < thresh, "err {err:}, thresh {thresh:}, num_items: {num_items:}, size bits: {size_bits:}, fp: {fp:}, sample fp: {sample_fp:}" ) ;
584590 }
585591 }
586592 }
@@ -714,8 +720,8 @@ macro_rules! impl_tests {
714720 #[ test]
715721 fn test_seeded_hash_from_hashes_depth( ) {
716722 for size in [ 1 , 10 , 100 , 1000 ] {
717- let mut rng = StdRng :: seed_from_u64 ( 524323 ) ;
718- let mut hasher = DoubleHasher :: new( rng. random_range ( 0 .. u64 :: MAX ) ) ;
723+ let mut rng = fastrand :: Rng :: with_seed ( 524323 ) ;
724+ let mut hasher = DoubleHasher :: new( rng. u64 ( .. ) ) ;
719725 let mut seeded_hash_counts: Vec <_> = repeat( 0 ) . take( size) . collect( ) ;
720726 for _ in 0 ..( size * 10_000 ) {
721727 let hi = hasher. next( ) ;
0 commit comments