请慢用,如果对你有帮助,就留个言,点个赞。

ConversionUtils.java

包含:
自增id转换方法
MD5+BASE64转换方法

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;/*** @Author : JCccc* @CreateTime : 2019/12/6* @Description :*  短链接生成*  10进制,62进制互转**/@Slf4j
public class ConversionUtils {/*** 初始化 62 进制数据,索引位置代表字符的数值,比如 A代表10,z代表61等*/private static String chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";private static int scale = 62;/*** 将数字转为62进制** @param num    Long 型数字* @param length 转换后的字符串长度,不足则左侧补0* @return 62进制字符串*/public static String encode(long num, int length) {StringBuilder sb = new StringBuilder();int remainder;// id混淆算法long snum = num & 0xff000000;snum += (num & 0x0000ff00) << 8;snum += (num & 0x00ff0000) >> 8;snum += (num & 0x0000000f) << 4;snum += (num & 0x000000f0) >> 4;while (snum > scale - 1) {/*对 scale 进行求余,然后将余数追加至 sb 中,由于是从末位开始追加的,因此最后需要反转(reverse)字符串*/remainder = Long.valueOf(snum % scale).intValue();sb.append(chars.charAt(remainder));snum = snum / scale;}sb.append(chars.charAt(Long.valueOf(snum).intValue()));String value = sb.reverse().toString();log.info("encode id: {}", snum);return StringUtils.leftPad(value, length, '0');}/*** 62进制字符串转为数字** @param str 编码后的62进制字符串* @return 解码后的 10 进制字符串*/public static long decode(String str) {/*将 0 开头的字符串进行替换*/str = str.replace("^0*", "");long num = 0;int index;for (int i = 0; i < str.length(); i++) {/*查找字符的索引位置*/index = chars.indexOf(str.charAt(i));/*索引位置代表字符的数值*/num += (long) (index * (Math.pow(scale, str.length() - i - 1)));}// id混淆算法long snum = num & 0xff000000;snum += (num & 0x00ff0000) >> 8;snum += (num & 0x0000ff00) << 8;snum += (num & 0x000000f0) >> 4;snum += (num & 0x0000000f) << 4;return snum;}public static String Md5CodeEncode(String longUrl, int urlLength) {if (urlLength < 4 ) {urlLength = 8;// defalut length}StringBuilder sbBuilder = new StringBuilder(urlLength + 2);String md5Hex = "";int nLen = 0;while (nLen < urlLength) {// 这个方法是先 md5 再 base64编码 参见// https://github.com/ndxt/centit-commons/blob/master/centit-utils/src/main/java/com/centit/support/security/Md5Encoder.javamd5Hex = Md5Encoder.encodeBase64(md5Hex + longUrl);for(int i=0;i<md5Hex.length();i++){char c = md5Hex.charAt(i);if(c != '/' && c != '+'){sbBuilder.append(c);nLen ++;}if(nLen == urlLength){break;}}}return sbBuilder.toString();}public static void main(String[] args) {System.out.println("62进制:" + encode(1000000001L, 6));System.out.println("10进制:" + decode("15t2ps"));System.out.println( Md5CodeEncode("http://abcd.cn/JCccc.html",6));}
}

Md5Encoder.java

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.binary.Hex;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;/*** @Author : JCccc* @CreateTime : 2019/11/27* @Description :**/
public abstract class Md5Encoder {private Md5Encoder() {throw new IllegalAccessError("Utility class");}protected static final Logger logger = LoggerFactory.getLogger(Md5Encoder.class);public static byte[] rawEncode(byte[] data){MessageDigest MD5;try {MD5 = MessageDigest.getInstance("MD5");MD5.update(data, 0, data.length);return MD5.digest();} catch (NoSuchAlgorithmException e) {logger.error(e.getMessage(),e);//e.printStackTrace();return null;}}public static String encode(byte[] data){byte [] md5Code = rawEncode(data);if(md5Code!=null){return new String(Hex.encodeHex(md5Code));} else {return null;}}public static String encode(String data){try {return encode(data.getBytes("utf8"));} catch (UnsupportedEncodingException e) {logger.error(e.getMessage(),e);//e.printStackTrace();return null;}}/*** 将md5 编码进行base64编码,去掉最后的两个==,16位的md5码base64后最后两位肯定是==* @param data 需要编码的 数据* @param urlSafe 返回url合法字符* @return 将md5 编码进行base64编码,去掉最后的两个==*/public static String encodeBase64(byte[] data, boolean urlSafe){byte [] md5Code = rawEncode(data);if(md5Code != null){return new String(urlSafe? Base64.encodeBase64URLSafe(md5Code): Base64.encodeBase64(md5Code),0,22);} else {return null;}}public static String encodeBase64(byte[] data){return encodeBase64(data, false);}public static String encodeBase64(String data, boolean urlSafe){try {return encodeBase64(data.getBytes("utf8"), urlSafe);} catch (UnsupportedEncodingException e) {logger.error(e.getMessage(),e);//e.printStackTrace();return null;}}public static String encodeBase64(String data){return encodeBase64(data, false);}/*** encoding password for spring security* 目前框架中的密码都是这样加密的* @param data  密文* @param salt  盐* @return 散列值*/public static String encodePasswordAsSpringSecurity(String data,String salt){return encode(data + "{" + salt + "}");}/*** encoding password for spring JA-SIG Cas* @param data  密文* @param salt  盐* @param iterations 迭代次数* @return 散列值*/public static String encodePasswordAsJasigCas(String data,String salt, int iterations){MessageDigest MD5;try {MD5 = MessageDigest.getInstance("MD5");byte[] saltBytes = salt.getBytes("utf8");MD5.update(saltBytes, 0, saltBytes.length);byte[] hashedBytes = MD5.digest(data.getBytes("utf8"));for(int i=0;i<iterations-1;i++)hashedBytes = MD5.digest(hashedBytes);return new String(Hex.encodeHex(hashedBytes));} catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {logger.error(e.getMessage(),e);//e.printStackTrace();return null;}}/*** 先腾框架默认的密码算法* @param data  密文* @param salt  盐* @return 散列值*/public static String encodePassword(String data,String salt){return encodePasswordAsSpringSecurity(data , salt);}/*** 先腾框架双重加密算法: 客户端 用md5将密码加密一下传输到后台,后台将密码再用salt加密一下放入数据库中*         这个算法可以用于后台设置密码时使用,正常验证和以前一样。* @param data  密文* @param salt  盐* @return 散列值*/public static String encodePasswordWithDoubleMd5(String data,String salt){return encodePasswordAsSpringSecurity(encode(data) , salt);}
}

JAVA 短链码生成工具类相关推荐

  1. Java短连接生成工具-思路

    Java短连接生成工具-思路-这里只是模拟一下 package com.csrs.trans.shorturl;import java.util.HashMap; import java.util.M ...

  2. java图形验证码生成工具类

    转载自   java图形验证码生成工具类 生成验证码效果       ValidateCode.java 验证码生成类 package cn.dsna.util.images; import java ...

  3. java 图形校验_java图形验证码生成工具类 web页面校验验证码

    java图形验证码生成工具类 web页面校验验证码 发布于 2020-7-14| 复制链接 摘记: 最近做验证码,参考网上案例,发现有不少问题,特意进行了修改和完善.验证码生成器: ```java i ...

  4. JAVA接口签名sign生成工具类

    签名规则 1.线下分配appid和appsecret,针对不同的调用方分配不同的appid和appsecret 2.加入timestamp(时间戳),10分钟内数据有效 3.加入流水号nonce(防止 ...

  5. Java:二维码生成工具类

    java 二维码生成工具类 需要引入的maven <!--Java 生成二维码 --> <dependency><groupId>com.google.zxing& ...

  6. 随机密码生成工具类(java)

    实现为用户生成随机密码需求,类似如下: package com.cmict.yywzx.common.core.utils;import java.util.*;/*** 随机密码生成工具 **/ p ...

  7. 【短信发送】实现腾讯云发送短信功能--工具类和SpringBoot配置两种方法实现

    实现腾讯云发送短信功能--工具类和SpringBoot配置两种方法实现 一.开通腾讯云短信服务 二.工具类--使用qcloudsms实现短信发送 三.Spring Boot项目引入短信发送功能 我们发 ...

  8. java Excel导入导出工具类 及使用demo

    java Excel导入导出工具类 及使用demo 前言:相信进来的都是想尽快解决问题的,话不多说,按照以下步骤来,可以操作导出excel到本地,导入同理,自行学习.步骤一:直接复制以下excel工具 ...

  9. java中常用的工具类

    1. 常用零散工具类 1.1[DateUtil.java]日期处理的工具类 /*** 时间日期处理工具* String -> Date* Date -> String* 以及生成含有日期的 ...

最新文章

  1. 洛谷P5273 【模板】多项式幂函数 (加强版)
  2. SQL大数据查询优化
  3. 去除Android开发文档中的URL,加速你的Android开发文档
  4. 2019年Linux与开源如何统治技术圈
  5. 大龄程序员的未来在何方
  6. 小学五年级计算机进度安排,苏教版小学五年级信息技术教学计划及进度安排.DOC...
  7. lua学习笔记(三)
  8. usionCharts 技术文档-Jsp画图
  9. 计算机组成原理完整学习笔记(二):系统总线
  10. Python:对压缩包进行解压操作
  11. mysql 表情符_java+mysql对于表情符的处理
  12. Mininet系列实验(一):Mininet使用源码安装
  13. codecombat 代码攻略
  14. 考研380分什么水平计算机,考研380分属于什么水平 算高分吗
  15. CAS单点登录四-单点登出
  16. 罗技Master 3 滚轮阻尼失效-解决方法
  17. cheat engin修改植物大战僵尸游戏
  18. 绝顶高手必经之路【资源共享】
  19. java 字符串判空_java判断字符串String是否为空问题浅析
  20. js爬取国家统计局行政区划(广东省)

热门文章

  1. 网友整理的Android面试题集-附网友提供的参考答案
  2. VHDL脉冲激光测距
  3. Android4.1 如何实现状态栏上信号图标有SIM卡1,2标记,并且当处于2G状态显示“G”,处于3G状态显示“3G”
  4. 【数据分析】- 游戏业务常用指标
  5. Excel学习日记:L1-excel入门
  6. 网络安全学习笔记——蓝队实战攻防
  7. dem生成等高线教程-dem提取等高线教程
  8. 【开发工具】 Photoshop CS6 安装与破解
  9. 如何成为一名卓越的软件工程师
  10. 微信端中的企业号、订阅号、服务号之前的区别