登录
首页 >  Golang >  Go教程

Go语言如何实现PHP字典排序及签名生成?

时间:2025-04-04 13:50:29 200浏览 收藏

本文讲解Go语言如何实现与PHP类似的字典排序和签名生成功能。PHP通常使用`ksort`进行字典排序,`http_build_query`序列化,最后计算MD5签名。Go语言需要找到等效方法,文章详细对比了PHP、Python和Go三种语言的实现方式,并着重解决Go语言中Unicode转义字符的处理,最终实现与PHP代码完全一致的签名生成结果,避免因编码差异导致签名不一致的问题。 学习本教程,您可以轻松掌握Go语言中字典排序和签名生成的技巧,并解决跨语言签名一致性难题。

Go语言实现PHP字典排序和签名生成详解

本文介绍如何使用Go语言实现与PHP类似的字典排序和签名生成功能。 PHP代码通常使用ksort对字典排序,然后用http_build_query序列化,最后计算MD5签名。 Go语言需要找到等效的实现方法。

我们先来看PHP代码示例:

$params = [
    'y' => 1,
    'x' => '有中文有符!@ 2号空格http://aaa.com',
    'a' => '{"a1":222,"a2":"\u4e2d\u6587"}',
];
$signkey = 'abc';
ksort($params);
$encodedparams = http_build_query($params);
echo md5($encodedparams . $signkey);  //输出  18cebcb0d00d0c48904fd4b06ed0319d

以及对应的Python代码示例(Python在处理Unicode转义字符方面与PHP略有不同):

import hashlib, urllib.parse
def sort_by_key(dict_var):
    sorted_tuple = sorted(dict_var.items(), key = lambda x:x[0])
    sorted_dict = {}
    for tuple_item in sorted_tuple:
        sorted_dict[tuple_item[0]] = tuple_item[1]
    return sorted_dict

sign_key = 'abc'
params = {
    'y': 1,
    'x': '有中文有符!@ 2号空格http://aaa.com',
    'a': '{"a1":222,"a2":"\u4e2d\u6587"}',
}
params = sort_by_key(params)

md5 = hashlib.md5()
sign_str = '%s%s' % (urllib.parse.urlencode(params), sign_key)
md5.update(sign_str.encode('utf-8'))
sign = md5.hexdigest()
print(sign)  #输出 bb59a6422816bd2e9111ec3fb54e2106  ,跟上面不同主要是因为 a2 的值序列化跟php的不一样

下面是Go语言的等效实现:

package main

import (
    "crypto/md5"
    "encoding/hex"
    "fmt"
    "net/url"
    "sort"
)

func main() {
    params := map[string]string{
        "x": "有中文有符!@ 2号空格http://aaa.com",
        "y": "1",
        "a": "{\"a1\":222,\"a2\":\"\\u4e2d\\u6587\"}",
    }

    keys := make([]string, 0, len(params))
    for k := range params {
        keys = append(keys, k)
    }
    sort.Strings(keys)

    data := url.Values{}
    for _, k := range keys {
        data.Add(k, params[k])
    }

    encodedParams := data.Encode()
    signKey := "abc"
    signData := encodedParams + signKey
    hash := md5.New()
    hash.Write([]byte(signData))
    bytes := hash.Sum(nil)
    sign := hex.EncodeToString(bytes)

    fmt.Println(sign) //输出 18cebcb0d00d0c48904fd4b06ed0319d
}

需要注意的是,Go语言的实现与PHP在处理Unicode转义字符(\uxxxx)方面保持一致。 Go语言代码中\"\\u4e2d\\u6587\""的写法确保了与PHP相同的字符串处理方式。 而Python代码需要额外处理才能得到与PHP一致的结果。 本Go语言代码确保生成的签名与PHP代码示例一致。

Go语言如何实现PHP的字典排序和签名生成?

今天关于《Go语言如何实现PHP字典排序及签名生成?》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>