go map 按字典升序排序后转 JSON md5 与 PHP 不一致
源码如下
package mainimport (
"fmt"
"sort"
"encoding/json"
"crypto/md5"
"encoding/hex"
"bytes"
)
func main() {
params := make(map[string]string)
params["name"] = "111"
params["domain"] = "www.baidu.com?name=1&id=1"
// 排序
keys := make([]string, len(params))
i := 0
for k, _ := range params {
keys[i] = k
i++
}
sort.Strings(keys)
for _, k := range keys {
fmt.Println(k)
}
byteBuf := bytes.NewBuffer([]byte{})
encoder := json.NewEncoder(byteBuf)
// 特殊字符不转义
encoder.SetEscapeHTML(false)
err := encoder.Encode(params)
if err != nil {
panic(err)
}
data := byteBuf.String()
fmt.Println(data)
h := md5.New()
// 与 php 一致
h.Write([]byte(`{"domain":"www.baidu.com?name=1&id=1","name":"111"}`))
// 不一致
// h.Write([]byte(data))
fmt.Println(hex.EncodeToString(h.Sum(nil)))
// php 结果为 06820973e7b8d3acdb4763264a803620
}
回答
结果一致
你自己尝试输出一下两边的 JSON 序列化结果,看看是不是空格、缩进、换行什么的不一样。
{ "id": 0, "name": "HelloWorld" }{"id":0,"name":"HelloWorld"}
{
"id": 0,
"name": "HelloWorld"
}
{
"id": 0,
"name": "HelloWorld"
}
从 JSON 结构上看上面几种输出是完全等价的,但从字符串的角度看显然不一致,就会导致哈希结果不相同。
以上是 go map 按字典升序排序后转 JSON md5 与 PHP 不一致 的全部内容, 来源链接: utcz.com/a/24603.html