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  }