1 // Copyright 2014 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
12 use std::hash::{Hash, Hasher};
13 use std::default::Default;
19 impl Default for MyHasher {
20 fn default() -> MyHasher {
25 impl Hasher for MyHasher {
26 fn write(&mut self, buf: &[u8]) {
28 self.hash += *byte as u64;
31 fn finish(&self) -> u64 { self.hash }
36 fn test_writer_hasher() {
37 fn hash<T: Hash>(t: &T) -> u64 {
38 ::std::hash::hash::<_, MyHasher>(t)
41 assert_eq!(hash(&()), 0);
43 assert_eq!(hash(&5_u8), 5);
44 assert_eq!(hash(&5_u16), 5);
45 assert_eq!(hash(&5_u32), 5);
46 assert_eq!(hash(&5_u64), 5);
47 assert_eq!(hash(&5_usize), 5);
49 assert_eq!(hash(&5_i8), 5);
50 assert_eq!(hash(&5_i16), 5);
51 assert_eq!(hash(&5_i32), 5);
52 assert_eq!(hash(&5_i64), 5);
53 assert_eq!(hash(&5_isize), 5);
55 assert_eq!(hash(&false), 0);
56 assert_eq!(hash(&true), 1);
58 assert_eq!(hash(&'a'), 97);
61 assert_eq!(hash(& s), 97 + 0xFF);
62 // FIXME (#18283) Enable test
63 //let s: Box<str> = box "a";
64 //assert_eq!(hasher.hash(& s), 97 + 0xFF);
65 let cs: &[u8] = &[1u8, 2u8, 3u8];
66 assert_eq!(hash(& cs), 9);
67 let cs: Box<[u8]> = box [1u8, 2u8, 3u8];
68 assert_eq!(hash(& cs), 9);
70 // FIXME (#18248) Add tests for hashing Rc<str> and Rc<[T]>
73 let ptr: *const i32 = mem::transmute(5_usize);
74 assert_eq!(hash(&ptr), 5);
78 let ptr: *mut i32 = mem::transmute(5_usize);
79 assert_eq!(hash(&ptr), 5);
83 struct Custom { hash: u64 }
84 struct CustomHasher { output: u64 }
86 impl Hasher for CustomHasher {
87 fn finish(&self) -> u64 { self.output }
88 fn write(&mut self, data: &[u8]) { panic!() }
89 fn write_u64(&mut self, data: u64) { self.output = data; }
92 impl Default for CustomHasher {
93 fn default() -> CustomHasher {
94 CustomHasher { output: 0 }
98 impl Hash for Custom {
99 fn hash<H: Hasher>(&self, state: &mut H) {
100 state.write_u64(self.hash);
105 fn test_custom_state() {
106 fn hash<T: Hash>(t: &T) -> u64 {
107 ::std::hash::hash::<_, CustomHasher>(t)
110 assert_eq!(hash(&Custom { hash: 5 }), 5);