/
base36.go
56 lines (45 loc) · 1.64 KB
/
base36.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/*
Copyright 2023 The Kubernetes Authors.
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 hash implements hashing utilities.
package hash
import (
"github.com/pkg/errors"
"golang.org/x/crypto/blake2b"
// keep the blank import to include intstr.
_ "k8s.io/apimachinery/pkg/util/intstr"
)
const base36set = "0123456789abcdefghijklmnopqrstuvwxyz"
// Base36TruncatedHash returns a consistent hash using blake2b
// and truncating the byte values to alphanumeric only
// of a fixed length specified by the consumer.
func Base36TruncatedHash(str string, hashLen int) (string, error) {
hasher, err := blake2b.New(hashLen, nil)
if err != nil {
return "", errors.Wrap(err, "unable to create hash function")
}
if _, err := hasher.Write([]byte(str)); err != nil {
return "", errors.Wrap(err, "unable to write hash")
}
return base36Truncate(hasher.Sum(nil)), nil
}
// base36Truncate returns a string that is base36 compliant
// It is not an encoding since it returns a same-length string
// for any byte value.
func base36Truncate(bytes []byte) string {
var chars string
for _, bite := range bytes {
idx := int(bite) % 36
chars += string(base36set[idx])
}
return chars
}