| //@ run-pass |
| #![allow(dead_code)] |
| #![allow(unused_imports)] |
| #![allow(deprecated)] |
| #![allow(non_camel_case_types)] |
| #![allow(non_snake_case)] |
| #![allow(overflowing_literals)] |
| |
| use std::hash::{Hash, SipHasher, Hasher}; |
| use std::mem::size_of; |
| |
| #[derive(Hash)] |
| struct Person { |
| id: usize, |
| name: String, |
| phone: usize, |
| } |
| |
| // test for hygiene name collisions |
| #[derive(Hash)] struct __H__H; |
| #[derive(Hash)] enum Collision<__H> { __H { __H__H: __H } } |
| |
| #[derive(Hash)] |
| enum E { A=1, B } |
| |
| fn hash<T: Hash>(t: &T) -> u64 { |
| let mut s = SipHasher::new(); |
| t.hash(&mut s); |
| s.finish() |
| } |
| |
| struct FakeHasher<'a>(&'a mut Vec<u8>); |
| impl<'a> Hasher for FakeHasher<'a> { |
| fn finish(&self) -> u64 { |
| unimplemented!() |
| } |
| |
| fn write(&mut self, bytes: &[u8]) { |
| self.0.extend(bytes); |
| } |
| } |
| |
| fn fake_hash<A: Hash>(v: &mut Vec<u8>, a: A) { |
| a.hash(&mut FakeHasher(v)); |
| } |
| |
| struct OnlyOneByteHasher; |
| impl Hasher for OnlyOneByteHasher { |
| fn finish(&self) -> u64 { |
| unreachable!() |
| } |
| |
| fn write(&mut self, bytes: &[u8]) { |
| assert_eq!(bytes.len(), 1); |
| } |
| } |
| |
| fn main() { |
| let person1 = Person { |
| id: 5, |
| name: "Janet".to_string(), |
| phone: 555_666_7777 |
| }; |
| let person2 = Person { |
| id: 5, |
| name: "Bob".to_string(), |
| phone: 555_666_7777 |
| }; |
| assert_eq!(hash(&person1), hash(&person1)); |
| assert!(hash(&person1) != hash(&person2)); |
| |
| // test #21714 |
| let mut va = vec![]; |
| let mut vb = vec![]; |
| fake_hash(&mut va, E::A); |
| fake_hash(&mut vb, E::B); |
| assert!(va != vb); |
| |
| // issue #39137: single variant enum hash should not hash discriminant |
| #[derive(Hash)] |
| enum SingleVariantEnum { |
| A(u8), |
| } |
| let mut v = vec![]; |
| fake_hash(&mut v, SingleVariantEnum::A(17)); |
| assert_eq!(vec![17], v); |
| |
| // issue #39137 |
| #[repr(u8)] |
| #[derive(Hash)] |
| enum E { |
| A, |
| B, |
| } |
| E::A.hash(&mut OnlyOneByteHasher); |
| } |