Kategorien
GO Lang

Random in GO

Wenn man in GO Lang einige male mit der rand.Intn() Funktione gearbeitet hat wird es einem schon aufgefallen sein.

Man bekommt bei ausführen des Codes hintereinander immer die Selben Zahlenreihenfolge. Probieren Sie es gerne aus und rufen ein paar mal hintereinander folgenden Code auf:

fmt.Println(rand.Intn(50))
fmt.Println(rand.Intn(50))
fmt.Println(rand.Intn(50))
fmt.Println(rand.Intn(50))

Dabei wird Ihnen schnell auffallen, dass es immer die selben Zahlenreihenfolge ist. Dies kann natürlich teilweise zu Sicherheitslücken führen, wenn man diese Funktion nutzt um einen random generierten Token zu erstellen. Weiß man den ersten Token des Admin Benutzers in der einen Installation, dann hat man mit hoher Wahrscheinlichkeit auch den Token des Benutzers in der Zeiten Installation.

Lösung

Dem ganzen kann man etwas entgegen wirken. Und zwar mit der Funktion rand.Seed(). Diese nimmt eine Zahl als Parameter entgegen. Auf der Basis dieser Zahl werden dann die Berechnungen der rand.Intn() Funktion getätigt.

Damit der Seed auch wirklich sich von mal zu mal differenziert kann man die Aktuelle Zeit in Nanosekunden als Parameter nutzen. Dadurch verändert sich der Seed bei jedem Aufruf. Das ganze kann wie folgt aussehen:

rand.Seed(time.Now().UnixNano())

fmt.Println(rand.Intn(50))
fmt.Println(rand.Intn(50))
fmt.Println(rand.Intn(50))
fmt.Println(rand.Intn(50))

Führen Sie diesen Code einige male aus und überzeugen Sie sich selbst.

Von Jonas Kwiedor

Full- Stack Developer aus Hamburg. Liebt es sich mit Schnittstellen & Automationen auseinander zu setzen und sich mit der Programmiersprache GO Lang zu beschäftigen.