diff options
author | Bjørn Erik Pedersen <[email protected]> | 2024-07-30 15:47:34 +0200 |
---|---|---|
committer | Bjørn Erik Pedersen <[email protected]> | 2024-07-31 16:44:06 +0200 |
commit | e67886c038dc79755c14ec77bbeff6605953f9ef (patch) | |
tree | 6b36585a55796b5a29d41764175e4d6d82a0d206 /identity | |
parent | d5eda13cb2e57998210b66e080dc96e95b38e5f0 (diff) | |
download | hugo-e67886c038dc79755c14ec77bbeff6605953f9ef.tar.gz hugo-e67886c038dc79755c14ec77bbeff6605953f9ef.zip |
Consolidate all hashing to the common/hashing package
And remove now unsued hashing funcs.
Diffstat (limited to 'identity')
-rw-r--r-- | identity/identityhash.go | 91 | ||||
-rw-r--r-- | identity/identityhash_test.go | 68 |
2 files changed, 0 insertions, 159 deletions
diff --git a/identity/identityhash.go b/identity/identityhash.go deleted file mode 100644 index 669a00a49..000000000 --- a/identity/identityhash.go +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright 2024 The Hugo Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package identity - -import ( - "strconv" - "sync" - - "github.com/cespare/xxhash/v2" - "github.com/gohugoio/hashstructure" -) - -// HashString returns a hash from the given elements. -// It will panic if the hash cannot be calculated. -// Note that this hash should be used primarily for identity, not for change detection as -// it in the more complex values (e.g. Page) will not hash the full content. -func HashString(vs ...any) string { - hash := HashUint64(vs...) - return strconv.FormatUint(hash, 10) -} - -var hashOptsPool = sync.Pool{ - New: func() any { - return &hashstructure.HashOptions{ - Hasher: xxhash.New(), - } - }, -} - -func getHashOpts() *hashstructure.HashOptions { - return hashOptsPool.Get().(*hashstructure.HashOptions) -} - -func putHashOpts(opts *hashstructure.HashOptions) { - opts.Hasher.Reset() - hashOptsPool.Put(opts) -} - -// HashUint64 returns a hash from the given elements. -// It will panic if the hash cannot be calculated. -// Note that this hash should be used primarily for identity, not for change detection as -// it in the more complex values (e.g. Page) will not hash the full content. -func HashUint64(vs ...any) uint64 { - var o any - if len(vs) == 1 { - o = toHashable(vs[0]) - } else { - elements := make([]any, len(vs)) - for i, e := range vs { - elements[i] = toHashable(e) - } - o = elements - } - - hashOpts := getHashOpts() - defer putHashOpts(hashOpts) - - hash, err := hashstructure.Hash(o, hashOpts) - if err != nil { - panic(err) - } - return hash -} - -type keyer interface { - Key() string -} - -// For structs, hashstructure.Hash only works on the exported fields, -// so rewrite the input slice for known identity types. -func toHashable(v any) any { - switch t := v.(type) { - case keyer: - return t.Key() - case IdentityProvider: - return t.GetIdentity() - default: - return v - } -} diff --git a/identity/identityhash_test.go b/identity/identityhash_test.go deleted file mode 100644 index fee38c8fe..000000000 --- a/identity/identityhash_test.go +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2024 The Hugo Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package identity - -import ( - "fmt" - "math" - "strings" - "testing" - - qt "github.com/frankban/quicktest" -) - -func TestHashString(t *testing.T) { - c := qt.New(t) - - c.Assert(HashString("a", "b"), qt.Equals, "3176555414984061461") - c.Assert(HashString("ab"), qt.Equals, "7347350983217793633") - - var vals []any = []any{"a", "b", tstKeyer{"c"}} - - c.Assert(HashString(vals...), qt.Equals, "4438730547989914315") - c.Assert(vals[2], qt.Equals, tstKeyer{"c"}) -} - -type tstKeyer struct { - key string -} - -func (t tstKeyer) Key() string { - return t.key -} - -func (t tstKeyer) String() string { - return "key: " + t.key -} - -func BenchmarkHashString(b *testing.B) { - word := " hello " - - var tests []string - - for i := 1; i <= 5; i++ { - sentence := strings.Repeat(word, int(math.Pow(4, float64(i)))) - tests = append(tests, sentence) - } - - b.ResetTimer() - - for _, test := range tests { - b.Run(fmt.Sprintf("n%d", len(test)), func(b *testing.B) { - for i := 0; i < b.N; i++ { - HashString(test) - } - }) - } -} |