2017-06-11 5 views
0

Ich möchte 64-Bit-Zufallszahl mit dem sicheren crypto/rand-Paket generieren. Ich fand das online:Random 64-Bit-Ganzzahl aus Krypto/Rand

package main 

import (
    "crypto/rand" 
    "encoding/base64" 
) 

// GenerateRandomBytes returns securely generated random bytes. 
// It will return an error if the system's secure random 
// number generator fails to function correctly, in which 
// case the caller should not continue. 
func GenerateRandomBytes(n int) ([]byte, error) { 
    b := make([]byte, n) 
    _, err := rand.Read(b) 
    // Note that err == nil only if we read len(b) bytes. 
    if err != nil { 
     return nil, err 
    } 

    return b, nil 
} 

Aber es scheint stattdessen zufällige Bytes zu generieren. Ich möchte einen zufälligen 64-Bit Int. Nämlich, ich möchte etwas wie var i uint64 = rand(). Irgendwelche Ideen, wie man das erreicht?

+0

Sie können nicht herausfinden, wie 8 zufällige Bytes in eine zufällige 64-Bit-Ganzzahl konvertiert werden? –

+0

Mögliches Duplikat von [Wie generierst du ein zufälliges uint64 in Go?] (Https://stackoverflow.com/questions/39756133/how-do-you-generate-a-random-uint64-in-go/39756320#39756320) – icza

+0

Kein Duplikat, @icza. Er möchte kryptographische Zufälligkeit verwenden. –

Antwort

1

Sie können eine Zufallszahl mit crypto.Rand, erzeugen und dann diese Bytes zu einem int64 mit dem binary Paket konvertieren:

func randint64() (int64, error) { 
    var b [8]byte 
    if _, err := rand.Read(b[:]); err != nil { 
     return 0, err 
    } 
    return int64(binary.LittleEndian.Uint64(b[:])), nil 
} 

https://play.golang.org/p/2Q8tvttqbJ (Ergebnis ist gecached)

Wenn man sich die source code for LittleEndian.Uint64 aussehen, Sie können sehen, dass es nur ein paar Bitoperationen an den Daten durchführt. etwas, das du für dich selbst umsetzen könntest.

+0

Danke. Wusste nicht für das Binärkodierungspaket. – typos