github.com/GuanceCloud/cliutils@v1.1.21/pkg/hash/fnv1a_test.go (about) 1 // Unless explicitly stated otherwise all files in this repository are licensed 2 // under the MIT License. 3 // This product includes software developed at Guance Cloud (https://www.guance.com/). 4 // Copyright 2021-present Guance, Inc. 5 6 package hash 7 8 import ( 9 "hash/fnv" 10 "testing" 11 12 "github.com/stretchr/testify/assert" 13 ) 14 15 func TestHash(t *testing.T) { 16 d := []string{ 17 `k8s_pod_namespace=d["k8s_pod_namespace"]`, 18 `k8s_container_name=d["k8s_container_name"]`, 19 `k8s_c ontainer_name=1`, `k8s_node_name=1, 20 fields=1`, 21 } 22 23 h1 := Fnv1aNew() 24 for _, s := range d { 25 h1 = Fnv1aHashAdd(h1, s) 26 } 27 28 h2 := Fnv1aHash(d) 29 30 h3 := hash4ts(d) 31 32 var s string 33 for _, v := range d { 34 s += v 35 } 36 h4 := Fnv1aStrHash(s) 37 38 assert.NotEqual(t, Fnv1aNew(), h1) 39 assert.Equal(t, h1, h2) 40 assert.Equal(t, h1, h3) 41 assert.Equal(t, h1, h4) 42 } 43 44 func BenchmarkIHashAdd(b *testing.B) { 45 d := []string{ 46 `k8s_pod_namespace=d["k8s_pod_namespace"]`, 47 `k8s_container_name=d["k8s_container_name"]`, 48 `k8s_c ontainer_name=1`, `k8s_node_name=1, 49 fields=1`, 50 } 51 for n := 0; n < b.N; n++ { 52 h := Fnv1aNew() 53 for _, s := range d { 54 h = Fnv1aHashAdd(h, s) 55 } 56 } 57 } 58 59 func BenchmarkIHash(b *testing.B) { 60 d := []string{ 61 `k8s_pod_namespace=d["k8s_pod_namespace"]`, 62 `k8s_container_name=d["k8s_container_name"]`, 63 `k8s_c ontainer_name=1`, `k8s_node_name=1, 64 fields=1`, 65 } 66 for n := 0; n < b.N; n++ { 67 Fnv1aHash(d) 68 // b.Error(Fnv1aHash2(d)) 69 } 70 } 71 72 func BenchmarkHash(b *testing.B) { 73 d := []string{ 74 `k8s_pod_namespace=d["k8s_pod_namespace"]`, 75 `k8s_container_name=d["k8s_container_name"]`, 76 `k8s_c ontainer_name=1`, `k8s_node_name=1, 77 fields=1`, 78 } 79 for n := 0; n < b.N; n++ { 80 hash4ts(d) 81 } 82 } 83 84 func BenchmarkHash2(b *testing.B) { 85 d := [][]byte{ 86 []byte(`k8s_pod_namespace=d["k8s_pod_namespace"]`), 87 []byte(`k8s_container_name=d["k8s_container_name"]`), 88 []byte(`k8s_c ontainer_name=1`), []byte(`k8s_node_name=1, 89 fields=1`), 90 } 91 for n := 0; n < b.N; n++ { 92 hash4tb(d) 93 } 94 } 95 96 func hash4ts(v []string) uint64 { 97 h := fnv.New64a() 98 for _, v := range v { 99 h.Write([]byte(v)) 100 } 101 return h.Sum64() 102 } 103 104 func hash4tb(v [][]byte) uint64 { 105 h := fnv.New64a() 106 for _, v := range v { 107 h.Write(v) 108 } 109 return h.Sum64() 110 }