This repository was archived by the owner on Nov 1, 2018. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathHash.hs
93 lines (68 loc) · 2.18 KB
/
Hash.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
module Hash where
--
-- Hash a value. Hashing produces an Int of
-- unspecified range.
--
class Hashable a where
hash :: a -> Int
instance Hashable Char where
hash x = ord x
instance Hashable Int where
hash x = x
instance Hashable Integer where
hash x = fromInteger x
instance Hashable Float where
hash x = truncate x
instance Hashable Double where
hash x = truncate x
instance Hashable Bin where
hash x = 0
instance Hashable File where
hash x = 0
instance Hashable () where
hash x = 0
instance Hashable (a -> b) where
hash x = 0
instance Hashable a => Hashable [a] where
hash l = f l 0
where f :: (Hashable a) => [a] -> Int -> Int
f [] r = r
f (c:cs) r = f cs (3*r + hash c)
#ifndef __HBCC__
instance Hashable [Char] where
hash l = f l 0
where f :: String -> Int -> Int
f [] r = r
f (c:cs) r = f cs (3*r + ord c)
#endif
instance (Hashable a, Hashable b) => Hashable (a,b) where
hash (a,b) = hash a + 3 * hash b
instance (Hashable a, Hashable b, Hashable c) => Hashable (a,b,c) where
hash (a,b,c) = hash a + 3 * hash b + 5 * hash c
instance (Hashable a, Hashable b, Hashable c, Hashable d) => Hashable (a,b,c,d) where
hash (a,b,c,d) = hash a + 3 * hash b + 5 * hash c + 7 * hash d
instance (Hashable a, Hashable b, Hashable c, Hashable d, Hashable e) => Hashable (a,b,c,d,e) where
hash (a,b,c,d,e) = hash a + 3 * hash b + 5 * hash c + 7 * hash d + 9 * hash e
instance Hashable Bool where
hash False = 0
hash True = 1
instance (Integral a, Hashable a) => Hashable (Ratio a) where
hash x = hash (denominator x) + hash (numerator x)
instance (RealFloat a, Hashable a) => Hashable (Complex a) where
hash (x :+ y) = hash x + hash y
instance (Hashable a, Hashable b) => Hashable (Assoc a b) where
hash (x := y) = hash x + hash y
instance (Ix a) => Hashable (Array a b) where
hash x = 0 -- !!!
instance Hashable Request where
hash x = 0 -- !!
instance Hashable Response where
hash x = 0 -- !!
instance Hashable IOError where
hash x = 0 -- !!
hashToMax maxhash x =
let h = hash x
in if h < 0 then
if -h < 0 then 0
else (-h) `rem` maxhash
else h `rem` maxhash