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 }