@@ -64,31 +64,29 @@ impl<P: Hs1Params> Hasher<P> {
64
64
assert ! ( usize :: from( self . bytes) <= self . block_u8( ) . len( ) ) ;
65
65
66
66
#[ inline( always) ]
67
- fn nh ( v1 : & [ u32 ] , v2 : & [ u32 ] ) -> u64 {
68
- debug_assert_eq ! ( v1. len( ) , v2. len( ) ) ;
69
- debug_assert_eq ! ( v1. len( ) % 4 , 0 ) ;
70
- // I originally used a fancy, compact iterator chain here but the optimizer is shit
71
- // (and honestly, this is pretty compact too)
72
- let mut s = 0u64 ;
73
- for ( x, y) in v1. chunks_exact ( 4 ) . zip ( v2. chunks_exact ( 4 ) ) {
74
- let d = u64:: from ( x[ 3 ] . wrapping_add ( y[ 3 ] ) ) ;
75
- let c = u64:: from ( x[ 2 ] . wrapping_add ( y[ 2 ] ) ) ;
76
- let b = u64:: from ( x[ 1 ] . wrapping_add ( y[ 1 ] ) ) ;
77
- let a = u64:: from ( x[ 0 ] . wrapping_add ( y[ 0 ] ) ) ;
78
- s = s. wrapping_add ( a * c) . wrapping_add ( b * d) ;
79
- }
80
- s
67
+ fn nh_step ( & [ ax, bx, cx, dx] : & [ u32 ; 4 ] , & [ ay, by, cy, dy] : & [ u32 ; 4 ] ) -> u64 {
68
+ let d = u64:: from ( dx. wrapping_add ( dy) ) ;
69
+ let c = u64:: from ( cx. wrapping_add ( cy) ) ;
70
+ let b = u64:: from ( bx. wrapping_add ( by) ) ;
71
+ let a = u64:: from ( ax. wrapping_add ( ay) ) ;
72
+ ( a * c) . wrapping_add ( b * d)
81
73
}
82
74
83
75
let m_ints = & self . block ;
84
76
85
77
let block16_count = usize:: from ( ( ( self . bytes + 15 ) / 16 ) . max ( 1 ) ) ;
86
78
87
- self . k
88
- . nh
89
- . windows ( B16 :: < P > :: to_usize ( ) / 4 )
90
- . step_by ( 4 )
91
- . map ( |k_n_i| nh ( & k_n_i[ ..block16_count * 4 ] , & m_ints[ ..block16_count * 4 ] ) )
79
+ let mut nh = Array :: < u64 , P :: T > :: default ( ) ;
80
+ for ( i0, m_ints_i) in m_ints. chunks_exact ( 4 ) . enumerate ( ) . take ( block16_count) {
81
+ for ( nh_i, k_n_i_i) in nh. iter_mut ( ) . zip ( self . k . nh . chunks_exact ( 4 ) . skip ( i0) ) {
82
+ let k_n_i_i = k_n_i_i. try_into ( ) . expect ( "exactly 4 elements" ) ;
83
+ let m_ints_i = m_ints_i. try_into ( ) . expect ( "exactly 4 elements" ) ;
84
+ let s = nh_step ( k_n_i_i, m_ints_i) ;
85
+ * nh_i = nh_i. wrapping_add ( s) ;
86
+ }
87
+ }
88
+
89
+ nh. iter ( )
92
90
. map ( |nh_i| ( nh_i + ( u64:: from ( self . bytes ) & mask ( 4 ) ) ) & mask ( 60 ) )
93
91
. zip ( self . k . poly . iter ( ) )
94
92
. zip ( self . h . iter_mut ( ) )
0 commit comments