8
8
// option. This file may not be copied, modified, or distributed
9
9
// except according to those terms.
10
10
use test:: Bencher ;
11
- use std:: prelude:: * ;
12
- use std:: fmt;
13
11
14
- use str:: Str ;
15
- use string:: String ;
16
- use slice:: { AsSlice , SlicePrelude } ;
17
- use vec:: Vec ;
18
-
19
- use core:: hash:: { Hash , Writer } ;
20
- use core:: hash:: sip:: { SipState , hash, hash_with_keys} ;
12
+ use core:: hash:: { Hash , Hasher } ;
13
+ use core:: hash:: SipHasher ;
21
14
22
15
// Hash just the bytes of the slice, without length prefix
23
16
struct Bytes < ' a > ( & ' a [ u8 ] ) ;
24
17
25
- impl < ' a , S : Writer > Hash < S > for Bytes < ' a > {
18
+ impl < ' a > Hash for Bytes < ' a > {
26
19
#[ allow( unused_must_use) ]
27
- fn hash ( & self , state : & mut S ) {
20
+ fn hash < H : Hasher > ( & self , state : & mut H ) {
28
21
let Bytes ( v) = * self ;
29
22
state. write ( v) ;
30
23
}
31
24
}
32
25
26
+ macro_rules! u8to64_le {
27
+ ( $buf: expr, $i: expr) =>
28
+ ( $buf[ 0 +$i] as u64 |
29
+ ( $buf[ 1 +$i] as u64 ) << 8 |
30
+ ( $buf[ 2 +$i] as u64 ) << 16 |
31
+ ( $buf[ 3 +$i] as u64 ) << 24 |
32
+ ( $buf[ 4 +$i] as u64 ) << 32 |
33
+ ( $buf[ 5 +$i] as u64 ) << 40 |
34
+ ( $buf[ 6 +$i] as u64 ) << 48 |
35
+ ( $buf[ 7 +$i] as u64 ) << 56 ) ;
36
+ ( $buf: expr, $i: expr, $len: expr) =>
37
+ ( {
38
+ let mut t = 0 ;
39
+ let mut out = 0 ;
40
+ while t < $len {
41
+ out |= ( $buf[ t+$i] as u64 ) << t* 8 ;
42
+ t += 1 ;
43
+ }
44
+ out
45
+ } ) ;
46
+ }
47
+
48
+ fn hash < T : Hash > ( x : & T ) -> u64 {
49
+ let mut st = SipHasher :: new ( ) ;
50
+ x. hash ( & mut st) ;
51
+ st. finish ( )
52
+ }
53
+
54
+ fn hash_with_keys < T : Hash > ( k1 : u64 , k2 : u64 , x : & T ) -> u64 {
55
+ let mut st = SipHasher :: new_with_keys ( k1, k2) ;
56
+ x. hash ( & mut st) ;
57
+ st. finish ( )
58
+ }
59
+
33
60
#[ test]
34
61
#[ allow( unused_must_use) ]
35
62
fn test_siphash ( ) {
@@ -104,79 +131,43 @@ fn test_siphash() {
104
131
let k1 = 0x_0f_0e_0d_0c_0b_0a_09_08 ;
105
132
let mut buf = Vec :: new ( ) ;
106
133
let mut t = 0 ;
107
- let mut state_inc = SipState :: new_with_keys ( k0, k1) ;
108
- let mut state_full = SipState :: new_with_keys ( k0, k1) ;
109
-
110
- fn to_hex_str ( r : & [ u8 ; 8 ] ) -> String {
111
- let mut s = String :: new ( ) ;
112
- for b in r {
113
- s. push_str ( format ! ( "{}" , fmt:: radix( * b, 16 ) ) ) ;
114
- }
115
- s
116
- }
117
-
118
- fn result_bytes ( h : u64 ) -> Vec < u8 > {
119
- vec ! [ ( h >> 0 ) as u8 ,
120
- ( h >> 8 ) as u8 ,
121
- ( h >> 16 ) as u8 ,
122
- ( h >> 24 ) as u8 ,
123
- ( h >> 32 ) as u8 ,
124
- ( h >> 40 ) as u8 ,
125
- ( h >> 48 ) as u8 ,
126
- ( h >> 56 ) as u8 ,
127
- ]
128
- }
129
-
130
- fn result_str ( h : u64 ) -> String {
131
- let r = result_bytes ( h) ;
132
- let mut s = String :: new ( ) ;
133
- for b in & r {
134
- s. push_str ( format ! ( "{}" , fmt:: radix( * b, 16 ) ) ) ;
135
- }
136
- s
137
- }
134
+ let mut state_inc = SipHasher :: new_with_keys ( k0, k1) ;
138
135
139
136
while t < 64 {
140
- debug ! ( "siphash test {}: {}" , t, buf) ;
141
137
let vec = u8to64_le ! ( vecs[ t] , 0 ) ;
142
- let out = hash_with_keys ( k0, k1, & Bytes ( buf) ) ;
143
- debug ! ( "got {}, expected {}" , out, vec) ;
138
+ let out = hash_with_keys ( k0, k1, & Bytes ( & buf) ) ;
144
139
assert_eq ! ( vec, out) ;
145
140
146
- state_full. reset ( ) ;
147
- state_full. write ( buf) ;
148
- let f = result_str ( state_full. result ( ) ) ;
149
- let i = result_str ( state_inc. result ( ) ) ;
150
- let v = to_hex_str ( & vecs[ t] ) ;
151
- debug ! ( "{}: ({}) => inc={} full={}" , t, v, i, f) ;
141
+ let full = hash_with_keys ( k0, k1, & Bytes ( & buf) ) ;
142
+ let i = state_inc. finish ( ) ;
152
143
153
- assert_eq ! ( f , i) ;
154
- assert_eq ! ( f , v ) ;
144
+ assert_eq ! ( full , i) ;
145
+ assert_eq ! ( full , vec ) ;
155
146
156
147
buf. push ( t as u8 ) ;
157
- state_inc . write ( & [ t as u8 ] ) ;
148
+ Hasher :: write ( & mut state_inc , & [ t as u8 ] ) ;
158
149
159
150
t += 1 ;
160
151
}
161
152
}
162
153
163
154
#[ test] #[ cfg( target_arch = "arm" ) ]
164
- fn test_hash_uint ( ) {
155
+ fn test_hash_usize ( ) {
165
156
let val = 0xdeadbeef_deadbeef_u64 ;
166
- assert ! ( hash( & ( val as u64 ) ) != hash( & ( val as uint ) ) ) ;
167
- assert_eq ! ( hash( & ( val as u32 ) ) , hash( & ( val as uint ) ) ) ;
157
+ assert ! ( hash( & ( val as u64 ) ) != hash( & ( val as usize ) ) ) ;
158
+ assert_eq ! ( hash( & ( val as u32 ) ) , hash( & ( val as usize ) ) ) ;
168
159
}
169
160
#[ test] #[ cfg( target_arch = "x86_64" ) ]
170
- fn test_hash_uint ( ) {
161
+ fn test_hash_usize ( ) {
171
162
let val = 0xdeadbeef_deadbeef_u64 ;
172
- assert_eq ! ( hash( & ( val as u64 ) ) , hash( & ( val as uint ) ) ) ;
173
- assert ! ( hash( & ( val as u32 ) ) != hash( & ( val as uint ) ) ) ;
163
+ assert_eq ! ( hash( & ( val as u64 ) ) , hash( & ( val as usize ) ) ) ;
164
+ assert ! ( hash( & ( val as u32 ) ) != hash( & ( val as usize ) ) ) ;
174
165
}
175
166
#[ test] #[ cfg( target_arch = "x86" ) ]
176
- fn test_hash_uint ( ) {
167
+ fn test_hash_usize ( ) {
177
168
let val = 0xdeadbeef_deadbeef_u64 ;
178
- assert ! ( hash( & ( val as u64 ) ) != hash( & ( val as uint ) ) ) ;
179
- assert_eq ! ( hash( & ( val as u32 ) ) , hash( & ( val as uint ) ) ) ;
169
+ assert ! ( hash( & ( val as u64 ) ) != hash( & ( val as usize ) ) ) ;
170
+ assert_eq ! ( hash( & ( val as u32 ) ) , hash( & ( val as usize ) ) ) ;
180
171
}
181
172
182
173
#[ test]
@@ -200,7 +191,7 @@ fn test_hash_no_bytes_dropped_64() {
200
191
assert ! ( hash( & val) != hash( & zero_byte( val, 6 ) ) ) ;
201
192
assert ! ( hash( & val) != hash( & zero_byte( val, 7 ) ) ) ;
202
193
203
- fn zero_byte ( val : u64 , byte : uint ) -> u64 {
194
+ fn zero_byte ( val : u64 , byte : usize ) -> u64 {
204
195
assert ! ( byte < 8 ) ;
205
196
val & !( 0xff << ( byte * 8 ) )
206
197
}
@@ -215,7 +206,7 @@ fn test_hash_no_bytes_dropped_32() {
215
206
assert ! ( hash( & val) != hash( & zero_byte( val, 2 ) ) ) ;
216
207
assert ! ( hash( & val) != hash( & zero_byte( val, 3 ) ) ) ;
217
208
218
- fn zero_byte ( val : u32 , byte : uint ) -> u32 {
209
+ fn zero_byte ( val : u32 , byte : usize ) -> u32 {
219
210
assert ! ( byte < 4 ) ;
220
211
val & !( 0xff << ( byte * 8 ) )
221
212
}
@@ -230,8 +221,9 @@ fn test_hash_no_concat_alias() {
230
221
assert ! ( s != t && t != u) ;
231
222
assert ! ( hash( & s) != hash( & t) && hash( & s) != hash( & u) ) ;
232
223
233
- let v: ( & [ u8 ] , & [ u8 ] , & [ u8 ] ) = ( & [ 1 ] , & [ 0 , 0 ] , & [ 0 ] ) ;
234
- let w: ( & [ u8 ] , & [ u8 ] , & [ u8 ] ) = ( & [ 1 , 0 , 0 , 0 ] , & [ ] , & [ ] ) ;
224
+ let u = [ 1 , 0 , 0 , 0 ] ;
225
+ let v = ( & u[ ..1 ] , & u[ 1 ..3 ] , & u[ 3 ..] ) ;
226
+ let w = ( & u[ ..] , & u[ 4 ..4 ] , & u[ 4 ..4 ] ) ;
235
227
236
228
assert ! ( v != w) ;
237
229
assert ! ( hash( & v) != hash( & w) ) ;
0 commit comments