PHP版签名算法

/**
 * 生成签名
 * -------------------------------------------------------------
 * @param   array $params 签名参数
 * @param   striing $token 签名私钥
 * @return  string
 * @todo
 * -------------------------------------------------------------
 * 例如:将函数assemble得到的字符串md5加密,然后转为大写,尾部连接密钥$token组成新的字符串,再md5,结果再转为大写
 */
function gen_matrix_sign($params,$token){
	return strtoupper(md5(strtoupper(md5(assemble($params))).$token));
}

/**
 * 组合签名参数
 * -------------------------------------------------------------
 * @param   array $params 签名参数
 * @return  string
 * @todo
 * -------------------------------------------------------------
 * 根据参数名称将你的所有请求参数按照字母先后顺序排序:
 * key + value .... key + value 对除签名和图片外的所有请求参数按key做的升序排列, value无需编码。
 * 例如:
 * 将foo=1,bar=2,baz=3 排序为bar=2,baz=3,foo=1 参数名和参数值链接后,得到拼装字符串bar2baz3foo1
 * -------------------------------------------------------------
 */
function assemble($params)
{
	if(!is_array($params)){
		return null;
	}

	ksort($params,SORT_STRING);
	$sign = '';
	foreach($params AS $key=>$val){
		$sign .= $key . (is_array($val) ? assemble($val) : $val);
	}
	return $sign;
}


PYTHON版签名算法:
# -*- coding: UTF-8 -*-
import hashlib

def md5(key):
    """""""""""""""""""""""""""""""""""""""
     # 生成md5加密串
     #
     # @param    string key 待加密字符串
     # @return   string 已加密字符串
     # @todo
    """""""""""""""""""""""""""""""""""""""
    hash = hashlib.md5()
    hash.update(key)
    return hash.hexdigest()

def ksort(data,rev=False):
    """""""""""""""""""""""""""""""""""""""
     # 对字典/列表按照键名排序
     #
     # @param    dict/list data 字典/列表对象
     # @param    bool rev 反向排序
     # @return   list each item is a tuple that contains (key,value)
     # @todo
    """""""""""""""""""""""""""""""""""""""
    return sorted(enumerate(data) if isinstance(data,list) else data.items(),key=lambda x:x[0],reverse=rev)

def assemble(params):
    """"""""""""""""""""""""""""""""""""""""""""""""
     # 组合签名参数
     #
     # @param   dict/list params
     # @return  str
     # @todo
    """"""""""""""""""""""""""""""""""""""""""""""""
    sort_params = ksort(params)
    sign_str = ''
    for k,v in sort_params:
        sign_str += '%s%s' % (k,assemble(v) if isinstance(v,(dict,list)) else v)
    return sign_str

def gen_matrix_sign(params,token):
    """"""""""""""""""""""""""""""""""""""""""""""""
     # 生成矩阵签名
     #
     # @param   dict/list params
     # @param   str token
     # @return  str
     # @todo
    """"""""""""""""""""""""""""""""""""""""""""""""
    return md5((md5(assemble(params)).upper()+token)).upper()