File tree Expand file tree Collapse file tree 1 file changed +26
-0
lines changed Expand file tree Collapse file tree 1 file changed +26
-0
lines changed Original file line number Diff line number Diff line change 1212#![ feature( hash_default) ]
1313
1414use std:: hash:: { Hash , SipHasher , Hasher } ;
15+ use std:: mem:: size_of;
1516
1617#[ derive( Hash ) ]
1718struct Person {
@@ -24,12 +25,30 @@ struct Person {
2425#[ derive( Hash ) ] struct __H__H ;
2526#[ derive( Hash ) ] enum Collision < __H > { __H { __H__H : __H } }
2627
28+ #[ derive( Hash ) ]
29+ enum E { A =1 , B }
30+
2731fn hash < T : Hash > ( t : & T ) -> u64 {
2832 let mut s = SipHasher :: new_with_keys ( 0 , 0 ) ;
2933 t. hash ( & mut s) ;
3034 s. finish ( )
3135}
3236
37+ struct FakeHasher < ' a > ( & ' a mut Vec < u8 > ) ;
38+ impl < ' a > Hasher for FakeHasher < ' a > {
39+ fn finish ( & self ) -> u64 {
40+ unimplemented ! ( )
41+ }
42+
43+ fn write ( & mut self , bytes : & [ u8 ] ) {
44+ self . 0 . extend ( bytes) ;
45+ }
46+ }
47+
48+ fn fake_hash ( v : & mut Vec < u8 > , e : E ) {
49+ e. hash ( & mut FakeHasher ( v) ) ;
50+ }
51+
3352fn main ( ) {
3453 let person1 = Person {
3554 id : 5 ,
@@ -43,4 +62,11 @@ fn main() {
4362 } ;
4463 assert_eq ! ( hash( & person1) , hash( & person1) ) ;
4564 assert ! ( hash( & person1) != hash( & person2) ) ;
65+
66+ // test #21714
67+ let mut va = vec ! [ ] ;
68+ let mut vb = vec ! [ ] ;
69+ fake_hash ( & mut va, E :: A ) ;
70+ fake_hash ( & mut vb, E :: B ) ;
71+ assert ! ( va != vb) ;
4672}
You can’t perform that action at this time.
0 commit comments