OSDN Git Service

libgo: Update to weekly.2011-12-02.
[pf3gnuchains/gcc-fork.git] / libgo / go / hash / fnv / fnv.go
1 // Copyright 2011 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
4
5 // Package fnv implements FNV-1 and FNV-1a, non-cryptographic hash functions
6 // created by Glenn Fowler, Landon Curt Noll, and Phong Vo.
7 // See http://isthe.com/chongo/tech/comp/fnv/.
8 package fnv
9
10 import (
11         "hash"
12 )
13
14 type (
15         sum32  uint32
16         sum32a uint32
17         sum64  uint64
18         sum64a uint64
19 )
20
21 const (
22         offset32 = 2166136261
23         offset64 = 14695981039346656037
24         prime32  = 16777619
25         prime64  = 1099511628211
26 )
27
28 // New32 returns a new 32-bit FNV-1 hash.Hash.
29 func New32() hash.Hash32 {
30         var s sum32 = offset32
31         return &s
32 }
33
34 // New32a returns a new 32-bit FNV-1a hash.Hash.
35 func New32a() hash.Hash32 {
36         var s sum32a = offset32
37         return &s
38 }
39
40 // New64 returns a new 64-bit FNV-1 hash.Hash.
41 func New64() hash.Hash64 {
42         var s sum64 = offset64
43         return &s
44 }
45
46 // New64a returns a new 64-bit FNV-1a hash.Hash.
47 func New64a() hash.Hash64 {
48         var s sum64a = offset64
49         return &s
50 }
51
52 func (s *sum32) Reset()  { *s = offset32 }
53 func (s *sum32a) Reset() { *s = offset32 }
54 func (s *sum64) Reset()  { *s = offset64 }
55 func (s *sum64a) Reset() { *s = offset64 }
56
57 func (s *sum32) Sum32() uint32  { return uint32(*s) }
58 func (s *sum32a) Sum32() uint32 { return uint32(*s) }
59 func (s *sum64) Sum64() uint64  { return uint64(*s) }
60 func (s *sum64a) Sum64() uint64 { return uint64(*s) }
61
62 func (s *sum32) Write(data []byte) (int, error) {
63         hash := *s
64         for _, c := range data {
65                 hash *= prime32
66                 hash ^= sum32(c)
67         }
68         *s = hash
69         return len(data), nil
70 }
71
72 func (s *sum32a) Write(data []byte) (int, error) {
73         hash := *s
74         for _, c := range data {
75                 hash ^= sum32a(c)
76                 hash *= prime32
77         }
78         *s = hash
79         return len(data), nil
80 }
81
82 func (s *sum64) Write(data []byte) (int, error) {
83         hash := *s
84         for _, c := range data {
85                 hash *= prime64
86                 hash ^= sum64(c)
87         }
88         *s = hash
89         return len(data), nil
90 }
91
92 func (s *sum64a) Write(data []byte) (int, error) {
93         hash := *s
94         for _, c := range data {
95                 hash ^= sum64a(c)
96                 hash *= prime64
97         }
98         *s = hash
99         return len(data), nil
100 }
101
102 func (s *sum32) Size() int  { return 4 }
103 func (s *sum32a) Size() int { return 4 }
104 func (s *sum64) Size() int  { return 8 }
105 func (s *sum64a) Size() int { return 8 }
106
107 func (s *sum32) Sum(in []byte) []byte {
108         v := uint32(*s)
109         in = append(in, byte(v>>24))
110         in = append(in, byte(v>>16))
111         in = append(in, byte(v>>8))
112         in = append(in, byte(v))
113         return in
114 }
115
116 func (s *sum32a) Sum(in []byte) []byte {
117         v := uint32(*s)
118         in = append(in, byte(v>>24))
119         in = append(in, byte(v>>16))
120         in = append(in, byte(v>>8))
121         in = append(in, byte(v))
122         return in
123 }
124
125 func (s *sum64) Sum(in []byte) []byte {
126         v := uint64(*s)
127         in = append(in, byte(v>>56))
128         in = append(in, byte(v>>48))
129         in = append(in, byte(v>>40))
130         in = append(in, byte(v>>32))
131         in = append(in, byte(v>>24))
132         in = append(in, byte(v>>16))
133         in = append(in, byte(v>>8))
134         in = append(in, byte(v))
135         return in
136 }
137
138 func (s *sum64a) Sum(in []byte) []byte {
139         v := uint64(*s)
140         in = append(in, byte(v>>56))
141         in = append(in, byte(v>>48))
142         in = append(in, byte(v>>40))
143         in = append(in, byte(v>>32))
144         in = append(in, byte(v>>24))
145         in = append(in, byte(v>>16))
146         in = append(in, byte(v>>8))
147         in = append(in, byte(v))
148         return in
149 }