2013-10-11 16 views
16

http://play.golang.org/p/SKtaPFtnKOGolang: da [] byte per ottenere esadecimale

func md(str string) []byte { 
    h := md5.New() 
    io.WriteString(h, str) 

    fmt.Printf("%x", h.Sum(nil)) 
    // base 16, with lower-case letters for a-f 
    return h.Sum(nil) 
} 

Tutto quello che serve è stringa Hash-chiave che viene convertito da una stringa di input. Sono stato in grado di ottenerlo in formato byte utilizzando h.Sum (nil) e in grado di stampare la chiave hash in formato% x. Ma voglio restituire il formato% x da questa funzione in modo che possa usarlo per convertire l'indirizzo email in chiave Hash e usarlo per accedere a Gravatar.com.

Come ottengo il tasto Hash in formato% x utilizzando la funzione md5 in Vai?

Grazie,

risposta

21

se ho capito bene che si desidera restituire il formato% x:

è possibile importare esadecimale e utilizzare il metodo EncodeToString

str := hex.EncodeToString(h.Sum(nil)) 

o semplicemente sprintf il valore:

func md(str string) string { 
    h := md5.New() 
    io.WriteString(h, str) 

    return fmt.Sprintf("%x", h.Sum(nil)) 
} 

nota che Sprintf è più lento perché ha bisogno di pa rse la stringa di formato e poi riflettere in base al tipo trovato

http://play.golang.org/p/vsFariAvKo

+3

[hex.EncodeToString] (http://golang.org/pkg/encoding/hex/#EncodeToString) è probabilmente leggermente più efficiente (nessuna riflessione ecc.). –

+0

Grazie.Ho aggiornato la risposta – fabrizioM

+4

'hex.EncodeToString' è circa 5 volte più veloce di' fmt' nel mio benchmarking –

9

Si dovrebbe evitare di utilizzare il pacchetto fmt per questo. Il pacchetto fmt utilizza la riflessione ed è costoso per qualsiasi altra cosa che non sia il debug. Sai cosa hai e su cosa vuoi convertire, quindi dovresti usare il pacchetto di conversione appropriato.

Per la conversione da binario a esadecimale e viceversa, utilizzare il pacchetto encoding/hex.

in esadecimale string:

str := hex.EncodeToString(h.Sum(nil)) 

Da Hex string:

b, err := hex.DecodeString(str) 

ci sono anche funzioni di codifica/decodifica per []byte.

Quando è necessario convertire in/da un decimale, utilizzare il pacchetto strconv.

Da int a string:

str := strconv.Itoa(100) 

Da string a int:

num, err := strconv.Atoi(str) 

Ci sono diverse altre funzioni in questo pacchetto che fanno altre conversioni (base, ecc).

Quindi, a meno che non si esegua il debug o la formattazione di un messaggio di errore, utilizza le conversioni corrette. Per favore.

Problemi correlati