-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathplatekit.go
More file actions
88 lines (76 loc) · 2.23 KB
/
platekit.go
File metadata and controls
88 lines (76 loc) · 2.23 KB
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
// Package platekit provides functions to generate random license plate strings.
//
// The license plate format is: `XX-000-000-XX`.
package platekit
import (
"fmt"
"math"
"math/rand/v2"
)
const (
alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
alphabetLength = len(alphabet)
numDigitsInGroup = 3
numLettersInGroup = 2
seedMultiplier = 31
maxDigit = 10
)
// Generate returns a random license plate string.
func Generate() string {
return GenerateFromSeed(rand.Int())
}
// GenerateFromSeed returns a license plate string based on a given seed.
func GenerateFromSeed(seed int) string {
return plateFromSeed(seed)
}
// GenerateFromString returns a license plate string based on a string value.
func GenerateFromString(value string) string {
seed := seedFromString(value)
return plateFromSeed(seed)
}
// splitMix32 returns a deterministic pseudo-random float64 generator based on the seed.
func splitMix32(seed int) func() float64 {
return func() float64 {
seed += 0x9e3779b9
hash := seed ^ (seed >> 16)
hash = hash * 0x21f0aaad
hash ^= hash >> 15
hash *= 0x735a2d97
hash ^= hash >> 15
return float64(hash) / float64(math.MaxInt)
}
}
// seedFromString creates a deterministic seed from a string.
func seedFromString(value string) int {
var seed int
for _, char := range value {
seed = seed*seedMultiplier + int(char)
}
return seed
}
// plateFromSeed generates a license plate string from a seed.
func plateFromSeed(seed int) string {
random := splitMix32(seed)
return fmt.Sprintf("%s-%s-%s-%s",
generateLetters(random),
generateDigits(random),
generateDigits(random),
generateLetters(random),
)
}
// generateLetters returns a string of random uppercase letters of length numLettersInGroup.
func generateLetters(random func() float64) string {
letters := make([]byte, numLettersInGroup)
for i := range numLettersInGroup {
letters[i] = alphabet[int(math.Floor(random()*float64(alphabetLength)))]
}
return string(letters)
}
// generateDigits returns a string of random digits of length numDigitsInGroup.
func generateDigits(random func() float64) string {
digits := make([]byte, numDigitsInGroup)
for i := range numDigitsInGroup {
digits[i] = byte('0' + int(math.Floor(random()*maxDigit)))
}
return string(digits)
}