-
Notifications
You must be signed in to change notification settings - Fork 4.7k
/
Copy pathtruncate.go
73 lines (58 loc) · 2 KB
/
truncate.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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/*
Copyright 2021 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 truncate
import (
"encoding/base32"
"hash/fnv"
"strings"
"k8s.io/klog/v2"
)
// TruncateStringOptions contains parameters for how we truncate strings
type TruncateStringOptions struct {
// AlwaysAddHash will always cause the hash to be appended.
// Useful to stop users assuming that the name will never be truncated.
AlwaysAddHash bool
// MaxLength controls the maximum length of the string.
MaxLength int
// HashLength controls the length of the hash to be appended.
HashLength int
}
// TruncateString will attempt to truncate a string to a max, adding a prefix to avoid collisions.
// Will never return a string longer than maxLength chars
func TruncateString(s string, opt TruncateStringOptions) string {
if opt.MaxLength == 0 {
klog.Fatalf("MaxLength must be set")
}
if !opt.AlwaysAddHash && len(s) <= opt.MaxLength {
return s
}
if opt.HashLength == 0 {
opt.HashLength = 6
}
// We always compute the hash and add it, lest we trick users into assuming that we never do this
h := fnv.New32a()
if _, err := h.Write([]byte(s)); err != nil {
klog.Fatalf("error hashing values: %v", err)
}
hashString := base32.HexEncoding.EncodeToString(h.Sum(nil))
hashString = strings.ToLower(hashString)
if len(hashString) > opt.HashLength {
hashString = hashString[:opt.HashLength]
}
maxBaseLength := opt.MaxLength - len(hashString) - 1
if len(s) > maxBaseLength {
s = s[:maxBaseLength]
}
s = s + "-" + hashString
return s
}