Skip to content

Commit 86d954b

Browse files
committed
core: Revive SipHash's tests
These tests were bitrotting, include them in the crate and bring them up to date and compiling.. and they pass.
1 parent 1b28ffa commit 86d954b

File tree

3 files changed

+61
-69
lines changed

3 files changed

+61
-69
lines changed

src/libcore/hash/sip.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@
1010

1111
//! An implementation of SipHash 2-4.
1212
13-
#![allow(deprecated)] // until the next snapshot for inherent wrapping ops
14-
1513
use prelude::*;
1614
use super::Hasher;
1715

src/libcoretest/hash/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
// option. This file may not be copied, modified, or distributed
99
// except according to those terms.
1010

11+
mod sip;
12+
1113
use std::mem;
1214
use std::hash::{Hash, Hasher};
1315
use std::default::Default;

src/libcoretest/hash/sip.rs

Lines changed: 59 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -8,28 +8,55 @@
88
// option. This file may not be copied, modified, or distributed
99
// except according to those terms.
1010
use test::Bencher;
11-
use std::prelude::*;
12-
use std::fmt;
1311

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;
2114

2215
// Hash just the bytes of the slice, without length prefix
2316
struct Bytes<'a>(&'a [u8]);
2417

25-
impl<'a, S: Writer> Hash<S> for Bytes<'a> {
18+
impl<'a> Hash for Bytes<'a> {
2619
#[allow(unused_must_use)]
27-
fn hash(&self, state: &mut S) {
20+
fn hash<H: Hasher>(&self, state: &mut H) {
2821
let Bytes(v) = *self;
2922
state.write(v);
3023
}
3124
}
3225

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+
3360
#[test]
3461
#[allow(unused_must_use)]
3562
fn test_siphash() {
@@ -104,79 +131,43 @@ fn test_siphash() {
104131
let k1 = 0x_0f_0e_0d_0c_0b_0a_09_08;
105132
let mut buf = Vec::new();
106133
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);
138135

139136
while t < 64 {
140-
debug!("siphash test {}: {}", t, buf);
141137
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));
144139
assert_eq!(vec, out);
145140

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();
152143

153-
assert_eq!(f, i);
154-
assert_eq!(f, v);
144+
assert_eq!(full, i);
145+
assert_eq!(full, vec);
155146

156147
buf.push(t as u8);
157-
state_inc.write(&[t as u8]);
148+
Hasher::write(&mut state_inc, &[t as u8]);
158149

159150
t += 1;
160151
}
161152
}
162153

163154
#[test] #[cfg(target_arch = "arm")]
164-
fn test_hash_uint() {
155+
fn test_hash_usize() {
165156
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)));
168159
}
169160
#[test] #[cfg(target_arch = "x86_64")]
170-
fn test_hash_uint() {
161+
fn test_hash_usize() {
171162
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)));
174165
}
175166
#[test] #[cfg(target_arch = "x86")]
176-
fn test_hash_uint() {
167+
fn test_hash_usize() {
177168
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)));
180171
}
181172

182173
#[test]
@@ -200,7 +191,7 @@ fn test_hash_no_bytes_dropped_64() {
200191
assert!(hash(&val) != hash(&zero_byte(val, 6)));
201192
assert!(hash(&val) != hash(&zero_byte(val, 7)));
202193

203-
fn zero_byte(val: u64, byte: uint) -> u64 {
194+
fn zero_byte(val: u64, byte: usize) -> u64 {
204195
assert!(byte < 8);
205196
val & !(0xff << (byte * 8))
206197
}
@@ -215,7 +206,7 @@ fn test_hash_no_bytes_dropped_32() {
215206
assert!(hash(&val) != hash(&zero_byte(val, 2)));
216207
assert!(hash(&val) != hash(&zero_byte(val, 3)));
217208

218-
fn zero_byte(val: u32, byte: uint) -> u32 {
209+
fn zero_byte(val: u32, byte: usize) -> u32 {
219210
assert!(byte < 4);
220211
val & !(0xff << (byte * 8))
221212
}
@@ -230,8 +221,9 @@ fn test_hash_no_concat_alias() {
230221
assert!(s != t && t != u);
231222
assert!(hash(&s) != hash(&t) && hash(&s) != hash(&u));
232223

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]);
235227

236228
assert!(v != w);
237229
assert!(hash(&v) != hash(&w));

0 commit comments

Comments
 (0)