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

}
阅读 5.5k
3 个回答

你自己尝试输出一下两边的 JSON 序列化结果,看看是不是空格、缩进、换行什么的不一样。

{ "id": 0, "name": "HelloWorld" }

{"id":0,"name":"HelloWorld"}

{
  "id": 0,
  "name": "HelloWorld"
}

{
    "id": 0,
    "name": "HelloWorld"
}

从 JSON 结构上看上面几种输出是完全等价的,但从字符串的角度看显然不一致,就会导致哈希结果不相同。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题