go map 按字典升序排序后转 JSON md5 与 PHP 不一致

源码如下

package main

import (

"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

}

回答

image.png
结果一致

你自己尝试输出一下两边的 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

回到顶部