github.com/varialus/godfly@v0.0.0-20130904042352-1934f9f095ab/src/pkg/hash/fnv/fnv.go (about)

     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) BlockSize() int  { return 1 }
   108  func (s *sum32a) BlockSize() int { return 1 }
   109  func (s *sum64) BlockSize() int  { return 1 }
   110  func (s *sum64a) BlockSize() int { return 1 }
   111  
   112  func (s *sum32) Sum(in []byte) []byte {
   113  	v := uint32(*s)
   114  	return append(in, byte(v>>24), byte(v>>16), byte(v>>8), byte(v))
   115  }
   116  
   117  func (s *sum32a) Sum(in []byte) []byte {
   118  	v := uint32(*s)
   119  	return append(in, byte(v>>24), byte(v>>16), byte(v>>8), byte(v))
   120  }
   121  
   122  func (s *sum64) Sum(in []byte) []byte {
   123  	v := uint64(*s)
   124  	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))
   125  }
   126  
   127  func (s *sum64a) Sum(in []byte) []byte {
   128  	v := uint64(*s)
   129  	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))
   130  }