"Go k8s 스타일 해시 함수"의 두 판 사이의 차이

(새 문서: ==개요== ;Go k8s 스타일 해시 함수 <syntaxhighlight lang='go' run> package main import ( "encoding/base32" "fmt" "hash/fnv" "strings" ) func k8sHash(s string, n int) st...)
 
 
(같은 사용자의 중간 판 8개는 보이지 않습니다)
1번째 줄: 1번째 줄:
==개요==
==개요==
;Go 베이스36 해시 함수
;Go k8s 스타일 해시 함수
;Go k8s 스타일 해시 함수


6번째 줄: 7번째 줄:


import (
import (
"encoding/base32"
"bytes"
"crypto/sha256"
"fmt"
"fmt"
"hash/fnv"
"strings"
)
)


func k8sHash(s string, n int) string {
func b36Hash(s string, n int) string {
h := fnv.New32a()
hasher := sha256.New()
h.Write([]byte(s))
_, _ = hasher.Write([]byte(s))
v := h.Sum32()
hashBytes := hasher.Sum(nil)
e := base32.StdEncoding.EncodeToString([]byte{byte(v >> 24), byte(v >> 16), byte(v >> 8), byte(v)})
 
return strings.ToLower(e[:n])
base36Chars := "0123456789abcdefghijklmnopqrstuvwxyz"
var base36Hash bytes.Buffer
for _, b := range hashBytes {
base36Hash.WriteByte(base36Chars[b%36])
}
var result bytes.Buffer
cnt := n / base36Hash.Len()
remainder := n % base36Hash.Len()
for i := 0; i < cnt; i++ {
result.Write(base36Hash.Bytes())
}
result.WriteString(base36Hash.String()[:remainder])
return result.String()
}
}


func main() {
func main() {
s := "Hello, world!"
s := "Hello, world!"
fmt.Println("Original string:", s)
fmt.Println(b36Hash(s, 5))  // dnj3a
h5 := k8sHash(s, 5)
fmt.Println(b36Hash(s, 7))  // dnj3asc
fmt.Println("5-character hash:", h5)
fmt.Println(b36Hash(s, 100)) // dnj3ascgnuc6621sp7vqbkxgj04jg4lvdnj3ascgnuc6621sp7vqbkxgj04jg4lvdnj3ascgnuc6621sp7vqbkxgj04jg4lvdnj3
h7 := k8sHash(s, 7)
fmt.Println("7-character hash:", h7)
}
}
</syntaxhighlight>
</syntaxhighlight>
32번째 줄: 42번째 줄:
[[분류: Go]]
[[분류: Go]]
[[분류: k8s]]
[[분류: k8s]]
[[분류: 해시 함수]]
[[분류:Base36]]

2024년 3월 3일 (일) 16:20 기준 최신판

개요[ | ]

Go 베이스36 해시 함수
Go k8s 스타일 해시 함수
package main

import (
	"bytes"
	"crypto/sha256"
	"fmt"
)

func b36Hash(s string, n int) string {
	hasher := sha256.New()
	_, _ = hasher.Write([]byte(s))
	hashBytes := hasher.Sum(nil)

	base36Chars := "0123456789abcdefghijklmnopqrstuvwxyz"
	var base36Hash bytes.Buffer
	for _, b := range hashBytes {
		base36Hash.WriteByte(base36Chars[b%36])
	}
	var result bytes.Buffer
	cnt := n / base36Hash.Len()
	remainder := n % base36Hash.Len()
	for i := 0; i < cnt; i++ {
		result.Write(base36Hash.Bytes())
	}
	result.WriteString(base36Hash.String()[:remainder])
	return result.String()
}

func main() {
	s := "Hello, world!"
	fmt.Println(b36Hash(s, 5))   // dnj3a
	fmt.Println(b36Hash(s, 7))   // dnj3asc
	fmt.Println(b36Hash(s, 100)) // dnj3ascgnuc6621sp7vqbkxgj04jg4lvdnj3ascgnuc6621sp7vqbkxgj04jg4lvdnj3ascgnuc6621sp7vqbkxgj04jg4lvdnj3
}
문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}