J'essaie de générer une chaîne aléatoire en Go et voici le code que j'ai écrit jusqu'à présent :
package main
import (
"bytes"
"fmt"
"math/rand"
"time"
)
func main() {
fmt.Println(randomString(10))
}
func randomString(l int) string {
var result bytes.Buffer
var temp string
for i := 0; i < l; {
if string(randInt(65, 90)) != temp {
temp = string(randInt(65, 90))
result.WriteString(temp)
i++
}
}
return result.String()
}
func randInt(min int, max int) int {
rand.Seed(time.Now().UTC().UnixNano())
return min + rand.Intn(max-min)
}
Ma mise en œuvre est très lente. Ensemencement à l'aide de time
apporte le même numéro aléatoire pendant un certain temps, de sorte que la boucle itère encore et encore. Comment puis-je améliorer mon code ?
2 votes
Le "if string(randInt(65,90))!=temp {" ressemble à une tentative d'ajouter une sécurité supplémentaire, mais les choses se ressemblent les unes après les autres par hasard. En faisant cela, vous pouvez en fait diminuer l'entropie.
3 votes
Par ailleurs, il n'est pas nécessaire de convertir en UTC dans "time.Now().UTC().UnixNano()". Le temps Unix est calculé depuis Epoch qui est UTC de toute façon.
2 votes
Vous devez définir la graine une fois, une seule fois, et jamais plus d'une fois. Si votre application fonctionne pendant plusieurs jours, vous pouvez la définir une fois par jour.
0 votes
Vous devez semer une fois. Et je pense que "Z" peut ne jamais apparaître, je suppose ? Je préfère donc utiliser l'index de début inclusif et l'index de fin exclusif.