go.charczuk.com@v0.0.0-20240327042549-bc490516bd1a/sdk/murmur3/murmur_test.go (about)

     1  /*
     2  
     3  Copyright (c) 2023 - Present. Will Charczuk. All rights reserved.
     4  Use of this source code is governed by a MIT license that can be found in the LICENSE file at the root of the repository.
     5  
     6  */
     7  
     8  package murmur3
     9  
    10  import (
    11  	"fmt"
    12  	"strconv"
    13  	"testing"
    14  )
    15  
    16  var data = []struct {
    17  	seed  uint32
    18  	h32   uint32
    19  	h64_1 uint64
    20  	h64_2 uint64
    21  	s     string
    22  }{
    23  	{0x00, 0x00000000, 0x0000000000000000, 0x0000000000000000, ""},
    24  	{0x00, 0x248bfa47, 0xcbd8a7b341bd9b02, 0x5b1e906a48ae1d19, "hello"},
    25  	{0x00, 0x149bbb7f, 0x342fac623a5ebc8e, 0x4cdcbc079642414d, "hello, world"},
    26  	{0x00, 0xe31e8a70, 0xb89e5988b737affc, 0x664fc2950231b2cb, "19 Jan 2038 at 3:14:07 AM"},
    27  	{0x00, 0xd5c48bfc, 0xcd99481f9ee902c9, 0x695da1a38987b6e7, "The quick brown fox jumps over the lazy dog."},
    28  
    29  	{0x01, 0x514e28b7, 0x4610abe56eff5cb5, 0x51622daa78f83583, ""},
    30  	{0x01, 0xbb4abcad, 0xa78ddff5adae8d10, 0x128900ef20900135, "hello"},
    31  	{0x01, 0x6f5cb2e9, 0x8b95f808840725c6, 0x1597ed5422bd493b, "hello, world"},
    32  	{0x01, 0xf50e1f30, 0x2a929de9c8f97b2f, 0x56a41d99af43a2db, "19 Jan 2038 at 3:14:07 AM"},
    33  	{0x01, 0x846f6a36, 0xfb3325171f9744da, 0xaaf8b92a5f722952, "The quick brown fox jumps over the lazy dog."},
    34  
    35  	{0x2a, 0x087fcd5c, 0xf02aa77dfa1b8523, 0xd1016610da11cbb9, ""},
    36  	{0x2a, 0xe2dbd2e1, 0xc4b8b3c960af6f08, 0x2334b875b0efbc7a, "hello"},
    37  	{0x2a, 0x7ec7c6c2, 0xb91864d797caa956, 0xd5d139a55afe6150, "hello, world"},
    38  	{0x2a, 0x58f745f6, 0xfd8f19ebdc8c6b6a, 0xd30fdc310fa08ff9, "19 Jan 2038 at 3:14:07 AM"},
    39  	{0x2a, 0xc02d1434, 0x74f33c659cda5af7, 0x4ec7a891caf316f0, "The quick brown fox jumps over the lazy dog."},
    40  }
    41  
    42  func Test_RefStrings(t *testing.T) {
    43  	for _, elem := range data {
    44  
    45  		h64 := New64WithSeed(elem.seed)
    46  		h64.Write([]byte(elem.s))
    47  		if v := h64.Sum64(); v != elem.h64_1 {
    48  			t.Errorf("'[Hash64] key: '%s', seed: '%d': 0x%x (want 0x%x)", elem.s, elem.seed, v, elem.h64_1)
    49  		}
    50  
    51  		h64.Reset()
    52  		h64.Write([]byte(elem.s))
    53  		target := fmt.Sprintf("%016x", elem.h64_1)
    54  		if p := fmt.Sprintf("%x", h64.Sum(nil)); p != target {
    55  			t.Errorf("[Hash64] key: '%s', seed: '%d': %s (want %s)", elem.s, elem.seed, p, target)
    56  		}
    57  
    58  		if v := Sum64WithSeed([]byte(elem.s), elem.seed); v != elem.h64_1 {
    59  			t.Errorf("[Hash64] key: '%s', seed: '%d': 0x%x (want 0x%x)", elem.s, elem.seed, v, elem.h64_1)
    60  		}
    61  
    62  		h128 := New128WithSeed(elem.seed)
    63  
    64  		h128.Write([]byte(elem.s))
    65  		if v1, v2 := h128.Sum128(); v1 != elem.h64_1 || v2 != elem.h64_2 {
    66  			t.Errorf("[Hash128] key: '%s', seed: '%d': 0x%x-0x%x (want 0x%x-0x%x)", elem.s, elem.seed, v1, v2, elem.h64_1, elem.h64_2)
    67  		}
    68  
    69  		h128.Reset()
    70  		h128.Write([]byte(elem.s))
    71  		target = fmt.Sprintf("%016x%016x", elem.h64_1, elem.h64_2)
    72  		if p := fmt.Sprintf("%x", h128.Sum(nil)); p != target {
    73  			t.Errorf("[Hash128] key: '%s', seed: '%d': %s (want %s)", elem.s, elem.seed, p, target)
    74  		}
    75  
    76  		if v1, v2 := Sum128WithSeed([]byte(elem.s), elem.seed); v1 != elem.h64_1 || v2 != elem.h64_2 {
    77  			t.Errorf("[Hash128] key: '%s', seed: '%d': 0x%x-0x%x (want 0x%x-0x%x)", elem.s, elem.seed, v1, v2, elem.h64_1, elem.h64_2)
    78  		}
    79  	}
    80  }
    81  
    82  func Benchmark64(b *testing.B) {
    83  	buf := make([]byte, 8192)
    84  	for length := 1; length <= cap(buf); length *= 2 {
    85  		b.Run(strconv.Itoa(length), func(b *testing.B) {
    86  			buf = buf[:length]
    87  			b.SetBytes(int64(length))
    88  			b.ReportAllocs()
    89  			b.ResetTimer()
    90  			for i := 0; i < b.N; i++ {
    91  				Sum64(buf)
    92  			}
    93  		})
    94  	}
    95  }
    96  
    97  func Benchmark128(b *testing.B) {
    98  	buf := make([]byte, 8192)
    99  	for length := 1; length <= cap(buf); length *= 2 {
   100  		b.Run(strconv.Itoa(length), func(b *testing.B) {
   101  			buf = buf[:length]
   102  			b.SetBytes(int64(length))
   103  			b.ReportAllocs()
   104  			b.ResetTimer()
   105  			for i := 0; i < b.N; i++ {
   106  				Sum128(buf)
   107  			}
   108  		})
   109  	}
   110  }