2014-03-31 49 views
1

我試圖從C#中移出一個算法去。我需要的一個步驟是獲取字節數組的md5。我似乎無法在C#和Go實現之間獲得一致的散列。MD5 C#和golang之間不一致

在C#中我可以這樣做:new MD5CryptoServiceProvider().ComputeHash(new byte[] { 5 }))

,我得到[139 182 193 120 56 100 63 150 145 204 106 77 230 197 23 9]

在旅途中:md5.New().Sum([]byte{5})

產量:[5 212 29 140 217 143 0 178 4 233 128 9 152 236 248 66 126]

我做得wrond,或者是實現實際上是不同的。我需要能夠複製C#行爲。

如果你想檢查我的整個實現,我有一些小提琴可用於goc#

+0

我只注意到你把任何值字節{},它總是在結果的第一位。奇怪的。 – Nath

+0

這將做到這一點:http://play.golang.org/p/gWRFTFDx80 – jimt

+0

其實,在這種情況下,你想使用這種形式:https://play.golang.org/p/nPiKoGYmHF – Aaron

回答

4

您正在誤用Sum函數的輸入。總和的輸入參數用於存儲輸出,而不是散列輸入。使用md5.Sum直接(如你想要的行爲),或者作爲例子證明寫返回Hash對象:http://golang.org/pkg/crypto/md5/#example_New

+0

其中之一我遇到的問題是我散列一個特定的字節數組,而不是一個字符串。每個例子都使用'io.WriteString'。我可以做'io.WriteString(h,string(myBytes))',但我不確定這會按我的意願工作。 – captncraig

+2

@ captncraig,'h.Write(myBytes)'。 http://play.golang.org/p/Uo8sMvtm64再次漫步文檔。 – JimB

+0

非常有趣。在什麼情況下,我想要將一個非零值傳遞給Sum函數?爲什麼該參數存在? – captncraig

2

應該

fmt.Println(md5.Sum([]byte{5})) 

對於你的第二個問題,在您的評論埃文:

hash.Hash實施io.Writer。所以,你總是可以做:

h := md5.New() 
h.Write([]byte{5}) 

看一看在hash.Hash interface