参数排序,生成md5的sign
import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.regex.Matcher; import java.util.regex.Pattern; public class HashUtils { private static final char[] HEX_CHARS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; public static char[] encodeHex(byte[] bytes) { char[] chars = new char[32]; for (int i = 0; i < chars.length; i += 2) { byte b = bytes[(i / 2)]; chars[i] = HEX_CHARS[(b >>> 4 & 0xF)]; chars[(i + 1)] = HEX_CHARS[(b & 0xF)]; } return chars; } public static MessageDigest getDigest(String algorithm) { try { return MessageDigest.getInstance(algorithm); } catch (NoSuchAlgorithmException ex) { throw new IllegalStateException("Could not find MessageDigest with algorithm \"" + algorithm + "\"", ex); } } public static String md5(String src) { MessageDigest md5 = getDigest("MD5"); return new String(encodeHex(md5.digest(src.getBytes()))); } public static String toSign(Map<String,Object> map) { return ""; }; public static String getFormatParams(Map<String, Object> params,boolean flag) throws UnsupportedEncodingException { List<Map.Entry<String, Object>> infoIds = new ArrayList<Map.Entry<String, Object>>((Collection<? extends Entry<String, Object>>) params.entrySet()); Collections.sort(infoIds, new Comparator<Map.Entry<String, Object>>() { public int compare(Map.Entry<String, Object> arg0, Map.Entry<String, Object> arg1) { return (arg0.getKey()).compareTo(arg1.getKey()); } }); String ret = ""; for (Map.Entry<String, Object> entry : infoIds) { ret += entry.getKey(); ret += "="; if(flag) { if(generateJudgment(entry.getValue().toString())) { ret +=URLEncoder.encode(entry.getValue().toString(), "UTF-8") ; }else { ret += entry.getValue().toString(); } }else { ret += entry.getValue().toString(); } ret += "&"; } ret = ret.substring(0, ret.length() - 1); return ret; } //判断是否有汉字 public static boolean generateJudgment(String countname){ Pattern p = Pattern.compile("[\u4e00-\u9fa5]"); Matcher isNum = p.matcher(countname); if (isNum.find()) { return true; } return false; } public static void main(String[] args) { String stringToSign = "B856915E" + "57C8666D91C346D1A23C766A4B8EDA85" + "1584338529869"; System.out.println(md5(stringToSign)); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人