Ich möchte einen zufälligen String von Zeichen nur (groß- oder kleinschreibung), keine Zahlen, in Go. Was ist der schnellste und einfachste Weg, dies zu tun?
Antworten
Zu viele Anzeigen?
kevin
Punkte
155
khilmi aminudin
Punkte
117
Normalerweise mache ich es so, wenn es eine Option gibt, ob Großbuchstaben verwendet werden sollen oder nicht
func randomString(length int, upperCase bool) string {
rand.Seed(time.Now().UnixNano())
var alphabet string
if upperCase {
alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
} else {
alphabet = "abcdefghijklmnopqrstuvwxyz"
}
var sb strings.Builder
l := len(alphabet)
for i := 0; i < length; i++ {
c := alphabet[rand.Intn(l)]
sb.WriteByte(c)
}
return sb.String()
}
und so, wenn keine Großbuchstaben benötigt werden
func randomString(length int) string {
rand.Seed(time.Now().UnixNano())
var alphabet string = "abcdefghijklmnopqrstuvwxyz"
var sb strings.Builder
l := len(alphabet)
for i := 0; i < length; i++ {
c := alphabet[rand.Intn(l)]
sb.WriteByte(c)
}
return sb.String()
}
Treviño
Punkte
2447
Mit rand.Int
aus math/rand
sind die Dinge jetzt ziemlich einfach:
import "math/rand"
func randStr(length uint) string {
bytes := make([]byte, int(length))
for i := uint(0); i < length; i++ {
bytes[i] = byte('!' + rand.Intn('~'-'!'))
}
return string(bytes)
}
Kann auf nur ASCII-Buchstaben begrenzt werden mit byte('a' + rand.Intn('z'-'a'))
Ahmed Kamal
Punkte
106
Als Fortsetzung zu iczas
brillanter Lösung nutze ich unten rand.Reader
func RandStringBytesMaskImprRandReaderUnsafe(length uint) (string, error) {
const (
charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
charIdxBits = 6 // 6 Bits zur Darstellung eines Buchstabenindex
charIdxMask = 1<= 0; {
if remain == 0 {
limit, err = rand.Int(rand.Reader, max)
if err != nil {
return "", err
}
cache, remain = limit.Int64(), charIdxMax
}
if idx := int(cache & charIdxMask); idx < charsetLength {
buffer[index] = charset[idx]
index--
}
cache >>= charIdxBits
remain--
}
return *(*string)(unsafe.Pointer(&buffer)), nil
}
func BenchmarkBytesMaskImprRandReaderUnsafe(b *testing.B) {
b.ReportAllocs()
b.ResetTimer()
const length = 16
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
RandStringBytesMaskImprRandReaderUnsafe(length)
}
})
}
Krishnadas PC
Punkte
4850
Dies ist ein Beispielcode, den ich verwendet habe, um die Zertifikatsnummer in meiner App zu generieren.
func GenerateCertificateNumber() string {
CertificateLength := 7
t := time.Now().String()
CertificateHash, err := bcrypt.GenerateFromPassword([]byte(t), bcrypt.DefaultCost)
if err != nil {
fmt.Println(err)
}
// Erstelle ein Regex, wir wollen nur Buchstaben und Zahlen
reg, err := regexp.Compile("[^a-zA-Z0-9]+")
if err != nil {
log.Fatal(err)
}
processedString := reg.ReplaceAllString(string(CertificateHash), "")
fmt.Println(string(processedString))
CertificateNumber := strings.ToUpper(string(processedString[len(processedString)-CertificateLength:]))
fmt.Println(CertificateNumber)
return CertificateNumber
}