aboutsummaryrefslogtreecommitdiffhomepage
path: root/identity
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <[email protected]>2024-07-30 15:47:34 +0200
committerBjørn Erik Pedersen <[email protected]>2024-07-31 16:44:06 +0200
commite67886c038dc79755c14ec77bbeff6605953f9ef (patch)
tree6b36585a55796b5a29d41764175e4d6d82a0d206 /identity
parentd5eda13cb2e57998210b66e080dc96e95b38e5f0 (diff)
downloadhugo-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.go91
-rw-r--r--identity/identityhash_test.go68
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)
- }
- })
- }
-}