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.
5 // Package fnv implements FNV-1 and FNV-1a, non-cryptographic hash functions
6 // created by Glenn Fowler, Landon Curt Noll, and Phong Vo.
8 // https://en.wikipedia.org/wiki/Fowler-Noll-Vo_hash_function.
10 // All the hash.Hash implementations returned by this package also
11 // implement encoding.BinaryMarshaler and encoding.BinaryUnmarshaler to
12 // marshal and unmarshal the internal state of the hash.
31 offset64
= 14695981039346656037
32 offset128Lower
= 0x62b821756295c58d
33 offset128Higher
= 0x6c62272e07bb0142
35 prime64
= 1099511628211
40 // New32 returns a new 32-bit FNV-1 hash.Hash.
41 // Its Sum method will lay the value out in big-endian byte order.
42 func New32() hash
.Hash32
{
43 var s sum32
= offset32
47 // New32a returns a new 32-bit FNV-1a hash.Hash.
48 // Its Sum method will lay the value out in big-endian byte order.
49 func New32a() hash
.Hash32
{
50 var s sum32a
= offset32
54 // New64 returns a new 64-bit FNV-1 hash.Hash.
55 // Its Sum method will lay the value out in big-endian byte order.
56 func New64() hash
.Hash64
{
57 var s sum64
= offset64
61 // New64a returns a new 64-bit FNV-1a hash.Hash.
62 // Its Sum method will lay the value out in big-endian byte order.
63 func New64a() hash
.Hash64
{
64 var s sum64a
= offset64
68 // New128 returns a new 128-bit FNV-1 hash.Hash.
69 // Its Sum method will lay the value out in big-endian byte order.
70 func New128() hash
.Hash
{
72 s
[0] = offset128Higher
77 // New128a returns a new 128-bit FNV-1a hash.Hash.
78 // Its Sum method will lay the value out in big-endian byte order.
79 func New128a() hash
.Hash
{
81 s
[0] = offset128Higher
86 func (s
*sum32
) Reset() { *s
= offset32
}
87 func (s
*sum32a
) Reset() { *s
= offset32
}
88 func (s
*sum64
) Reset() { *s
= offset64
}
89 func (s
*sum64a
) Reset() { *s
= offset64
}
90 func (s
*sum128
) Reset() { s
[0] = offset128Higher
; s
[1] = offset128Lower
}
91 func (s
*sum128a
) Reset() { s
[0] = offset128Higher
; s
[1] = offset128Lower
}
93 func (s
*sum32
) Sum32() uint32 { return uint32(*s
) }
94 func (s
*sum32a
) Sum32() uint32 { return uint32(*s
) }
95 func (s
*sum64
) Sum64() uint64 { return uint64(*s
) }
96 func (s
*sum64a
) Sum64() uint64 { return uint64(*s
) }
98 func (s
*sum32
) Write(data
[]byte) (int, error
) {
100 for _
, c
:= range data
{
105 return len(data
), nil
108 func (s
*sum32a
) Write(data
[]byte) (int, error
) {
110 for _
, c
:= range data
{
115 return len(data
), nil
118 func (s
*sum64
) Write(data
[]byte) (int, error
) {
120 for _
, c
:= range data
{
125 return len(data
), nil
128 func (s
*sum64a
) Write(data
[]byte) (int, error
) {
130 for _
, c
:= range data
{
135 return len(data
), nil
138 func (s
*sum128
) Write(data
[]byte) (int, error
) {
139 for _
, c
:= range data
{
140 // Compute the multiplication in 4 parts to simplify carrying
141 s1l
:= (s
[1] & 0xffffffff) * prime128Lower
142 s1h
:= (s
[1] >> 32) * prime128Lower
143 s0l
:= (s
[0]&0xffffffff)*prime128Lower
+ (s
[1]&0xffffffff)<<prime128Shift
144 s0h
:= (s
[0]>>32)*prime128Lower
+ (s
[1]>>32)<<prime128Shift
150 s
[1] = (s1l
& 0xffffffff) + (s1h
<< 32)
151 s
[0] = (s0l
& 0xffffffff) + (s0h
<< 32)
154 return len(data
), nil
157 func (s
*sum128a
) Write(data
[]byte) (int, error
) {
158 for _
, c
:= range data
{
160 // Compute the multiplication in 4 parts to simplify carrying
161 s1l
:= (s
[1] & 0xffffffff) * prime128Lower
162 s1h
:= (s
[1] >> 32) * prime128Lower
163 s0l
:= (s
[0]&0xffffffff)*prime128Lower
+ (s
[1]&0xffffffff)<<prime128Shift
164 s0h
:= (s
[0]>>32)*prime128Lower
+ (s
[1]>>32)<<prime128Shift
170 s
[1] = (s1l
& 0xffffffff) + (s1h
<< 32)
171 s
[0] = (s0l
& 0xffffffff) + (s0h
<< 32)
173 return len(data
), nil
176 func (s
*sum32
) Size() int { return 4 }
177 func (s
*sum32a
) Size() int { return 4 }
178 func (s
*sum64
) Size() int { return 8 }
179 func (s
*sum64a
) Size() int { return 8 }
180 func (s
*sum128
) Size() int { return 16 }
181 func (s
*sum128a
) Size() int { return 16 }
183 func (s
*sum32
) BlockSize() int { return 1 }
184 func (s
*sum32a
) BlockSize() int { return 1 }
185 func (s
*sum64
) BlockSize() int { return 1 }
186 func (s
*sum64a
) BlockSize() int { return 1 }
187 func (s
*sum128
) BlockSize() int { return 1 }
188 func (s
*sum128a
) BlockSize() int { return 1 }
190 func (s
*sum32
) Sum(in
[]byte) []byte {
192 return append(in
, byte(v
>>24), byte(v
>>16), byte(v
>>8), byte(v
))
195 func (s
*sum32a
) Sum(in
[]byte) []byte {
197 return append(in
, byte(v
>>24), byte(v
>>16), byte(v
>>8), byte(v
))
200 func (s
*sum64
) Sum(in
[]byte) []byte {
202 return append(in
, byte(v
>>56), byte(v
>>48), byte(v
>>40), byte(v
>>32), byte(v
>>24), byte(v
>>16), byte(v
>>8), byte(v
))
205 func (s
*sum64a
) Sum(in
[]byte) []byte {
207 return append(in
, byte(v
>>56), byte(v
>>48), byte(v
>>40), byte(v
>>32), byte(v
>>24), byte(v
>>16), byte(v
>>8), byte(v
))
210 func (s
*sum128
) Sum(in
[]byte) []byte {
212 byte(s
[0]>>56), byte(s
[0]>>48), byte(s
[0]>>40), byte(s
[0]>>32), byte(s
[0]>>24), byte(s
[0]>>16), byte(s
[0]>>8), byte(s
[0]),
213 byte(s
[1]>>56), byte(s
[1]>>48), byte(s
[1]>>40), byte(s
[1]>>32), byte(s
[1]>>24), byte(s
[1]>>16), byte(s
[1]>>8), byte(s
[1]),
217 func (s
*sum128a
) Sum(in
[]byte) []byte {
219 byte(s
[0]>>56), byte(s
[0]>>48), byte(s
[0]>>40), byte(s
[0]>>32), byte(s
[0]>>24), byte(s
[0]>>16), byte(s
[0]>>8), byte(s
[0]),
220 byte(s
[1]>>56), byte(s
[1]>>48), byte(s
[1]>>40), byte(s
[1]>>32), byte(s
[1]>>24), byte(s
[1]>>16), byte(s
[1]>>8), byte(s
[1]),
230 magic128a
= "fnv\x06"
231 marshaledSize32
= len(magic32
) + 4
232 marshaledSize64
= len(magic64
) + 8
233 marshaledSize128
= len(magic128
) + 8*2
236 func (s
*sum32
) MarshalBinary() ([]byte, error
) {
237 b
:= make([]byte, 0, marshaledSize32
)
238 b
= append(b
, magic32
...)
239 b
= appendUint32(b
, uint32(*s
))
243 func (s
*sum32a
) MarshalBinary() ([]byte, error
) {
244 b
:= make([]byte, 0, marshaledSize32
)
245 b
= append(b
, magic32a
...)
246 b
= appendUint32(b
, uint32(*s
))
250 func (s
*sum64
) MarshalBinary() ([]byte, error
) {
251 b
:= make([]byte, 0, marshaledSize64
)
252 b
= append(b
, magic64
...)
253 b
= appendUint64(b
, uint64(*s
))
258 func (s
*sum64a
) MarshalBinary() ([]byte, error
) {
259 b
:= make([]byte, 0, marshaledSize64
)
260 b
= append(b
, magic64a
...)
261 b
= appendUint64(b
, uint64(*s
))
265 func (s
*sum128
) MarshalBinary() ([]byte, error
) {
266 b
:= make([]byte, 0, marshaledSize128
)
267 b
= append(b
, magic128
...)
268 b
= appendUint64(b
, s
[0])
269 b
= appendUint64(b
, s
[1])
273 func (s
*sum128a
) MarshalBinary() ([]byte, error
) {
274 b
:= make([]byte, 0, marshaledSize128
)
275 b
= append(b
, magic128a
...)
276 b
= appendUint64(b
, s
[0])
277 b
= appendUint64(b
, s
[1])
281 func (s
*sum32
) UnmarshalBinary(b
[]byte) error
{
282 if len(b
) < len(magic32
) ||
string(b
[:len(magic32
)]) != magic32
{
283 return errors
.New("hash/fnv: invalid hash state identifier")
285 if len(b
) != marshaledSize32
{
286 return errors
.New("hash/fnv: invalid hash state size")
288 *s
= sum32(readUint32(b
[4:]))
292 func (s
*sum32a
) UnmarshalBinary(b
[]byte) error
{
293 if len(b
) < len(magic32a
) ||
string(b
[:len(magic32a
)]) != magic32a
{
294 return errors
.New("hash/fnv: invalid hash state identifier")
296 if len(b
) != marshaledSize32
{
297 return errors
.New("hash/fnv: invalid hash state size")
299 *s
= sum32a(readUint32(b
[4:]))
303 func (s
*sum64
) UnmarshalBinary(b
[]byte) error
{
304 if len(b
) < len(magic64
) ||
string(b
[:len(magic64
)]) != magic64
{
305 return errors
.New("hash/fnv: invalid hash state identifier")
307 if len(b
) != marshaledSize64
{
308 return errors
.New("hash/fnv: invalid hash state size")
310 *s
= sum64(readUint64(b
[4:]))
314 func (s
*sum64a
) UnmarshalBinary(b
[]byte) error
{
315 if len(b
) < len(magic64a
) ||
string(b
[:len(magic64a
)]) != magic64a
{
316 return errors
.New("hash/fnv: invalid hash state identifier")
318 if len(b
) != marshaledSize64
{
319 return errors
.New("hash/fnv: invalid hash state size")
321 *s
= sum64a(readUint64(b
[4:]))
325 func (s
*sum128
) UnmarshalBinary(b
[]byte) error
{
326 if len(b
) < len(magic128
) ||
string(b
[:len(magic128
)]) != magic128
{
327 return errors
.New("hash/fnv: invalid hash state identifier")
329 if len(b
) != marshaledSize128
{
330 return errors
.New("hash/fnv: invalid hash state size")
332 s
[0] = readUint64(b
[4:])
333 s
[1] = readUint64(b
[12:])
337 func (s
*sum128a
) UnmarshalBinary(b
[]byte) error
{
338 if len(b
) < len(magic128a
) ||
string(b
[:len(magic128a
)]) != magic128a
{
339 return errors
.New("hash/fnv: invalid hash state identifier")
341 if len(b
) != marshaledSize128
{
342 return errors
.New("hash/fnv: invalid hash state size")
344 s
[0] = readUint64(b
[4:])
345 s
[1] = readUint64(b
[12:])
349 func readUint32(b
[]byte) uint32 {
351 return uint32(b
[3]) |
uint32(b
[2])<<8 |
uint32(b
[1])<<16 |
uint32(b
[0])<<24
354 func appendUint32(b
[]byte, x
uint32) []byte {
361 return append(b
, a
[:]...)
364 func appendUint64(b
[]byte, x
uint64) []byte {
375 return append(b
, a
[:]...)
378 func readUint64(b
[]byte) uint64 {
380 return uint64(b
[7]) |
uint64(b
[6])<<8 |
uint64(b
[5])<<16 |
uint64(b
[4])<<24 |
381 uint64(b
[3])<<32 |
uint64(b
[2])<<40 |
uint64(b
[1])<<48 |
uint64(b
[0])<<56