1
1
extern crate clap;
2
+ extern crate ahash;
2
3
3
- use std:: collections:: { HashSet , HashMap , hash_map, hash_map :: DefaultHasher } ;
4
+ use std:: collections:: { HashSet , HashMap , hash_map} ;
4
5
use std:: hash:: { Hasher , BuildHasher } ;
5
6
use std:: io:: { stdin, BufRead , BufReader , stdout, Write , BufWriter } ;
6
7
use std:: slice;
8
+ use ahash:: ABuildHasher ;
7
9
use clap:: { Arg , App } ;
8
10
use anyhow:: Result ;
9
11
@@ -54,8 +56,8 @@ impl BuildHasher for BuildIdentityHasher {
54
56
}
55
57
}
56
58
57
- fn hash < T : std:: hash:: Hash > ( v : & T ) -> u64 {
58
- let mut s = DefaultHasher :: new ( ) ;
59
+ fn calc_hash < T : BuildHasher , U : std:: hash:: Hash > ( build : & T , v : & U ) -> u64 {
60
+ let mut s = build . build_hasher ( ) ;
59
61
v. hash ( & mut s) ;
60
62
s. finish ( )
61
63
}
@@ -65,6 +67,7 @@ fn uniq_cmd(delim: u8) -> Result<()> {
65
67
let inp = stdin ( ) ;
66
68
let mut out = BufWriter :: new ( out. lock ( ) ) ;
67
69
let mut inp = BufReader :: new ( inp. lock ( ) ) ;
70
+ let hasher = ABuildHasher :: new ( ) ;
68
71
let mut set = HashSet :: < u64 , BuildIdentityHasher > :: default ( ) ;
69
72
let mut line = Vec :: < u8 > :: new ( ) ;
70
73
while inp. read_until ( delim, & mut line) ? > 0 {
@@ -73,7 +76,7 @@ fn uniq_cmd(delim: u8) -> Result<()> {
73
76
line. pop ( ) ;
74
77
}
75
78
76
- if set. insert ( hash ( & line) ) {
79
+ if set. insert ( calc_hash ( & hasher , & line) ) {
77
80
out. write ( & line) ?;
78
81
out. write ( slice:: from_ref ( & delim) ) ?;
79
82
}
0 commit comments