第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Golang 用 MD5 編碼字符串 UTF16 little endian 和 hash

Golang 用 MD5 編碼字符串 UTF16 little endian 和 hash

Go
眼眸繁星 2021-11-22 15:58:07
我是 Go 初學(xué)者,遇到了一個問題。我想用 UTF16 little endian 編碼一個字符串,然后用 MD5(十六進(jìn)制)對其進(jìn)行散列。我找到了一段 Python 代碼,它完全符合我的要求。但我無法將其轉(zhuǎn)移到 Google Go。md5 = hashlib.md5()md5.update(challenge.encode('utf-16le'))response = md5.hexdigest()挑戰(zhàn)是一個包含字符串的變量。
查看完整描述

3 回答

?
精慕HU

TA貢獻(xiàn)1845條經(jīng)驗 獲得超8個贊

您可以通過使用golang.org/x/text/encoding和golang.org/x/text/transform創(chuàng)建一個 Writer 鏈來完成編碼和散列操作,從而減少工作量(或至少更易理解,IMO)這么多手動字節(jié)切片處理。等效函數(shù):


func utf16leMd5(s string) []byte {

    enc := unicode.UTF16(unicode.LittleEndian, unicode.IgnoreBOM).NewEncoder()

    hasher := md5.New()

    t := transform.NewWriter(hasher, enc)

    t.Write([]byte(s))

    return hasher.Sum(nil)

}


查看完整回答
反對 回復(fù) 2021-11-22
?
慕姐4208626

TA貢獻(xiàn)1852條經(jīng)驗 獲得超7個贊

您可以使用該unicode/utf16包進(jìn)行 UTF-16 編碼。utf16.Encode()返回 Unicode 代碼點序列(符文片段:)的 UTF-16 編碼[]rune。您可以簡單地將 a 轉(zhuǎn)換string為一段符文,例如[]rune("some string"),您可以通過覆蓋uint16代碼并首先發(fā)送/附加低字節(jié)然后將高字節(jié)發(fā)送/附加到輸出(這是Little Endian 是什么意思)。


對于 Little Endian 編碼,您也可以使用encoding/binary包:它有一個導(dǎo)出的LittleEndian變量和一個PutUint16()方法。


至于MD5校驗和,crypto/md5包里有你想要的,md5.Sum()簡單返回傳遞給它的字節(jié)片的MD5校驗和。


這是一個小函數(shù),可以捕獲您想要執(zhí)行的操作:


func utf16leMd5(s string) [16]byte {

    codes := utf16.Encode([]rune(s))

    b := make([]byte, len(codes)*2)

    for i, r := range codes {

        b[i*2] = byte(r)

        b[i*2+1] = byte(r >> 8)

    }

    return md5.Sum(b)

}

使用它:


s := "Hello, playground"

fmt.Printf("%x\n", utf16leMd5(s))


s = "エヌガミ"

fmt.Printf("%x\n", utf16leMd5(s))

輸出:


8f4a54c6ac7b88936e990256cc9d335b

5f0db9e9859fd27f750eb1a212ad6212

在Go Playground.


使用的變體encoding/binary如下所示:


for i, r := range codes {

    binary.LittleEndian.PutUint16(b[i*2:], r)

}

(雖然這會比較慢,因為它會創(chuàng)建很多新的切片標(biāo)題。)


查看完整回答
反對 回復(fù) 2021-11-22
?
元芳怎么了

TA貢獻(xiàn)1798條經(jīng)驗 獲得超7個贊

所以,作為參考,我使用了這個完整的python程序:


import hashlib

import codecs


md5 = hashlib.md5()

md5.update(codecs.encode('Hello, playground', 'utf-16le'))

response = md5.hexdigest()

print response

它打印 8f4a54c6ac7b88936e990256cc9d335b


這是 Go 等效項:https : //play.golang.org/p/Nbzz1dCSGI


package main


import (

    "crypto/md5"

    "encoding/binary"

    "encoding/hex"

    "fmt"

    "unicode/utf16"

)


func main() {

    s := "Hello, playground"


    fmt.Println(md5Utf16le(s))

}


func md5Utf16le(s string) string {

    encoded := utf16.Encode([]rune(s))


    b := convertUTF16ToLittleEndianBytes(encoded)


    return md5Hexadecimal(b)

}


func md5Hexadecimal(b []byte) string {

    h := md5.New()

    h.Write(b)

    return hex.EncodeToString(h.Sum(nil))

}


func convertUTF16ToLittleEndianBytes(u []uint16) []byte {

    b := make([]byte, 2*len(u))

    for index, value := range u {

        binary.LittleEndian.PutUint16(b[index*2:], value)

    }

    return b

}


查看完整回答
反對 回復(fù) 2021-11-22
  • 3 回答
  • 0 關(guān)注
  • 355 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號