| // Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com> |
| // All rights reserved. |
| // |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| package util |
| |
| import ( |
| "encoding/binary" |
| ) |
| |
| // Hash return hash of the given data. |
| func Hash(data []byte, seed uint32) uint32 { |
| // Similar to murmur hash |
| const ( |
| m = uint32(0xc6a4a793) |
| r = uint32(24) |
| ) |
| var ( |
| h = seed ^ (uint32(len(data)) * m) |
| i int |
| ) |
| |
| for n := len(data) - len(data)%4; i < n; i += 4 { |
| h += binary.LittleEndian.Uint32(data[i:]) |
| h *= m |
| h ^= (h >> 16) |
| } |
| |
| switch len(data) - i { |
| default: |
| panic("not reached") |
| case 3: |
| h += uint32(data[i+2]) << 16 |
| fallthrough |
| case 2: |
| h += uint32(data[i+1]) << 8 |
| fallthrough |
| case 1: |
| h += uint32(data[i]) |
| h *= m |
| h ^= (h >> r) |
| case 0: |
| } |
| |
| return h |
| } |