ASCII码从小到大排序

这里写自定义目录标题

ASCII码从小到大排序

用ASCII码按照字典序从小到大对参数名进行排序,并输出为字符串。

import java.util.*;

public class StringSortingUtil {

    public static void main(String[] args) {
        // 示例用法
        Map<String, String> params = new HashMap<>();
        params.put("appid", "asdfdadfasd");
        params.put("unionId", "ffeefefefe");
        params.put("bankId", "ewwfwf");

        String sortedResult = sortAndFormatParams(params);
        System.out.println("按字典序排序后的参数和字符串:");
        System.out.println(sortedResult);
    }

    public static String sortAndFormatParams(Map<String, String> params) {
        // 将Map转换为List以便排序
        List<Map.Entry<String, String>> entries = new ArrayList<>(params.entrySet());

        // 使用自定义的Comparator按照字符串的字典序(ASCII码顺序)排序
        entries.sort(new Comparator<Map.Entry<String, String>>() {
            @Override
            public int compare(Map.Entry<String, String> entry1, Map.Entry<String, String> entry2) {
                return entry1.getValue().compareTo(entry2.getValue());
            }
        });

        // 构建格式化后的字符串
        StringBuilder sortedString = new StringBuilder();
        for (Map.Entry<String, String> entry : entries) {
            sortedString.append(entry.getKey()).append(": ").append(entry.getValue()).append(", ");
        }

        // 删除末尾多余的逗号和空格
        if (sortedString.length() > 0) {
            sortedString.delete(sortedString.length() - 2, sortedString.length());
        }

        return sortedString.toString();
    }
}
### 参数按照ASCII排序的实现方法 在处理如API请求等场景时,需要对参数按照参数ASCII顺序进行排序。这通常用于生成请求签,以确保参数的完整性和顺序的正确性。具体来说,参数按照ASCII从小到大排序,可以确保生成的签在不同平台和实现中保持一致[^1]。 #### 实现逻辑 1. **提取参数键**:从参数对象中提取所有的键(参数)。 2. **排序参数键**:将这些键按照ASCII顺序从小到大排序。 3. **拼接参数字符串**:将排序后的参数按照`key=value`的格式拼接成一个字符串。 4. **添加签密钥**:在拼接字符串的末尾追加`&key=API密钥`,其中`API密钥`是预先定义的密钥。 5. **生成签**:使用MD5算法对最终字符串进行哈希处理,生成32位小写的签值。 #### 示例代 以下是一个使用Node.js实现的完整示例: ```javascript const crypto = require('crypto'); // 生成签 function generateSign(params, apiKey) { const keys = Object.keys(params).sort(); // 按ASCII字典序排序 const str = keys.map(k => `${k}=${params[k]}`).join('&') + `&key=${apiKey}`; return crypto.createHash('md5').update(str).digest('hex'); } // 示例参数 const params = { re_openid: 'oTBP85Rexxxxxxxxxxxxxxxxx', total_amount: 100, mch_billno: '20230901123456789', nonce_str: 'randomstring123', mch_id: '1900000101', wxappid: 'wx8888888888888888' }; const apiKey = 'your_api_key_here'; // 替换为你的API密钥 // 生成签 const sign = generateSign(params, apiKey); console.log('生成的签:', sign); ``` 在上述代中,通过`Object.keys(params).sort()`实现了参数ASCII排序,并通过`crypto`模块生成了MD5签。 #### 注意事项 - **忽略空值**:在实际应用中,空值和签字段通常会被忽略。 - **编处理**:某些场景下需要对参数值进行URL编,但微信支付接口通常要求不编。 - **签验证**:生成签后,可以通过与接口返回的签对比,验证请求的合法性。 #### 参数排序的扩展应用 除了用于生成签参数按照ASCII排序还可以用于其他场景,例如: - **日志记录**:按固定顺序记录参数,便于日志分析。 - **缓存键生成**:确保相同参数生成相同的缓存键。 - **数据一致性校验**:在分布式系统中校验数据一致性。 ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值