Java 根据 Map 的 key 的 ASCII 码从小到大排序

当前主流的公有云,如亚马逊、阿里云、腾讯云,
其API的访问都支持使用签名信息,以验证请求者的身份。
而生成签名信息的第一步,
就是对请求参数进行排序,按照ASCII码升序排列。
下面示例将展示,Java 环境下,如何对请求参数进行ASCII码的升序排序。

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

public class Test3 {
	public static void main(String[] args) {

		// 方式一:TreeMap可以自动排序
		TreeMap<String, Object> params = new TreeMap<String, Object>();
		setData(params);
		
		StringBuilder s1 = new StringBuilder();
        for (String key : params.keySet()) {
            s1.append(key).append("=").append(params.get(key)).append("&");
        }
        s1.deleteCharAt(s1.length() - 1);
		System.out.println(s1);
		
		//方式二:使用HashMap,并使用Arrays.sort排序
		HashMap<String, Object> params2 = new HashMap<String, Object>();
		setData(params2);
		String[] sortedKeys = params2.keySet().toArray(new String[]{});
		Arrays.sort(sortedKeys);// 排序请求参数
		StringBuilder s2 = new StringBuilder();
        for (String key : sortedKeys) {
        	s2.append(key).append("=").append(params2.get(key)).append("&");
        }
        s2.deleteCharAt(s2.length() - 1);
		System.out.println(s2);
		
		System.out.println(s1.toString().equals(s2.toString()));
		

	}
	
	private  static void setData(Map<String,Object> params){
		params.put("Nonce", 11886); 
		params.put("Timestamp", 1465185768); 
		params.put("SecretId", "AKIDz8krbsJ5yKBZQpn74WFkmLPx3EXAMPLE");
		params.put("Action", "DescribeInstances"); 
		params.put("Version", "2017-03-12"); 
		params.put("Region", "ap-guangzhou"); 
		params.put("Limit", 20); 
		params.put("Offset", 0); 
		params.put("测试", "测试"); 
	}
}

输出结果:
Action=DescribeInstances&Limit=20&Nonce=11886&Offset=0&Region=ap-guangzhou&SecretId=AKIDz8krbsJ5yKBZQpn74WFkmLPx3EXAMPLE&Timestamp=1465185768&Version=2017-03-12&测试=测试

Action=DescribeInstances&Limit=20&Nonce=11886&Offset=0&Region=ap-guangzhou&SecretId=AKIDz8krbsJ5yKBZQpn74WFkmLPx3EXAMPLE&Timestamp=1465185768&Version=2017-03-12&测试=测试

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值