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 分享