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

go语言实现php字典排序和签名生成详解

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

我们先来看PHP代码示例:

$params = [     'y' => 1,     'x' => '有中文有符!@ 2号空格http://aaa.com',     'a' => '{"a1":222,"a2":"u4e2du6587"}', ]; $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":"u4e2du6587"}', } 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语言的等效实现:

立即学习PHP免费学习笔记(深入)”;

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":"u4e2du6587"}",     }      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语言代码中”u4e2du6587″”的写法确保了与PHP相同的字符串处理方式。 而Python代码需要额外处理才能得到与PHP一致的结果。 本Go语言代码确保生成的签名与PHP代码示例一致。

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

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享