2013-10-11 7 views
16

http://play.golang.org/p/SKtaPFtnKOGolang: von [] Bytes hexadezimal zu bekommen

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) 
} 

Alles was ich brauche Hash-Schlüsselzeichenfolge ist, die aus einer Eingabezeichenfolge umgewandelt wird. Ich konnte es im Byte-Format mit h.Sum (nil) erhalten und den Hash-Schlüssel im% x Format ausdrucken. Aber ich möchte das% x-Format von dieser Funktion zurückgeben, damit ich es verwenden kann, um die E-Mail-Adresse in den Hash-Schlüssel zu konvertieren und damit auf Gravatar.com zuzugreifen.

Wie bekomme ich% x Format Hash-Schlüssel mit MD5-Funktion in Go?

Danke,

Antwort

21

Wenn ich das richtig verstanden Sie die% x-Format zurückkehren wollen:

Sie hex importieren und verwenden Sie die EncodeToString Methode

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

oder nur Sprintf den Wert:

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

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

Beachten Sie, dass Sprintf langsamer ist, weil es pa muss rse die String-Format und dann auf dem Typ reflect basierend gefunden

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

+3

[hex.EncodeToString] (http://golang.org/pkg/encoding/hex/#EncodeToString) ist wahrscheinlich etwas effizienter (keine Reflektion usw.). –

+0

Danke.Ich aktualisierte die Antwort – fabrizioM

+4

'hex.EncodeToString' ist etwa 5x schneller als' fmt' in meinem Benchmarking –

9

Sie sollten mit dem fmt Paket für das vermeiden. Das fmt Paket verwendet Reflektion, und es ist teuer für alles andere als Debuggen. Sie wissen, was Sie haben und in was Sie konvertieren möchten, also sollten Sie das richtige Konvertierungspaket verwenden.

Verwenden Sie für die Konvertierung von Binär zu Hex und zurück das Paket encoding/hex.

string In Hex:

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

Von Hex string:

b, err := hex.DecodeString(str) 

Es sind auch Encode/Decode Funktionen für []byte.

Wenn Sie zu/von einer Dezimalzahl konvertieren müssen, verwenden Sie das strconv Paket.

Von int zu string:

str := strconv.Itoa(100) 

Von string zu int:

num, err := strconv.Atoi(str) 

Es gibt mehrere andere Funktionen in diesem Paket, das andere Konvertierungen (Basis, etc.).

Also, wenn Sie eine Fehlermeldung debuggen oder formatieren, verwenden Sie die richtigen Konvertierungen. Bitte.

Verwandte Themen