short url 算法

package com.glodon.paas.coqui.util;

import java.security.MessageDigest;

public class TokenGenerator {
        private final static String[] md5Chars = {"0","1" ,"2" ,"3" ,"4" ,"5" ,"6" ,"7" ,"8" ,"9" ,"A" ,"B" ,"C" ,"D" ,"E" ,"F" };
        public static String generate(String str) {
               // 可以自定义生成MD5加密字符传前的混合KEY
              String key = "glodoncloud";
               // 要使用生成URL的字符
              String[] chars = new String[] { "a" , "b" , "c" , "d" , "e" , "f" , "g" , "h",
                            "i", "j" , "k" , "l" , "m" , "n" , "o" , "p" , "q" , "r" , "s" , "t",
                            "u", "v" , "w" , "x" , "y" , "z" , "0" , "1" , "2" , "3" , "4" , "5",
                            "6", "7" , "8" , "9" , "A" , "B" , "C" , "D" , "E" , "F" , "G" , "H",
                            "I", "J" , "K" , "L" , "M" , "N" , "O" , "P" , "Q" , "R" , "S" , "T",
                            "U", "V" , "W" , "X" , "Y" , "Z"

              };
              
               // 对传入网址进行MD5加密
              String hex = encodeByMD5(key+str);

              String[] resUrl = new String[4];

               for (int i = 0; i < 4; i++) {
                      // 把加密字符按照8位一组16进制与0x3FFFFFFF进行位与运算
                      long hexint = Long.valueOf( "3FFFFFFF", 16) & Long.valueOf( hex.substring(i * 8,(i+1)*8), 16);
                     String outChars = "";
                      for (int j = 0; j < 6; j++) {
                            // 把得到的值与0x0000003D进行位与运算,取得字符数组chars索引
                            int index =  (int) (Long.valueOf ("0000003D" , 16) & hexint);
                            // 把取得的字符相加
                           outChars += chars[index];
                            // 每次循环按位右移5位
                           hexint = hexint >> 5;
                     }
                      // 把字符串存入对应索引的输出数组
                     resUrl[i] = outChars;
              }

               return resUrl[0];

       }


    /**对字符串进行MD5编码*/
    private static String encodeByMD5(String originString){
        if (originString!=null) {
            try {
                //创建具有指定算法名称的信息摘要
                MessageDigest md5 = MessageDigest. getInstance("MD5");
                //使用指定的字节数组对摘要进行最后更新,然后完成摘要计算
                byte[] results = md5.digest(originString.getBytes());
                //将得到的字节数组变成字符串返回 
                String result = byteArrayToHexString(results);
                return result;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return null ;
    }
 
    /**
    * 轮换字节数组为十六进制字符串
    * @param b 字节数组
    * @return 十六进制字符串
    */
    private static String byteArrayToHexString(byte[] b){
        StringBuffer resultSb = new StringBuffer();
        for(int i=0;i<b.length;i++){
            resultSb.append( byteToHexString(b[i]));
        }
        return resultSb.toString();
    }
    private static String byteToHexString(byte b){
        int n = b;
        if(n<0)
        n=256+n;
        int d1 = n/16;
        int d2 = n%16;
        return md5Chars [d1] + md5Chars[d2];
    }
        public static void main(String[] args){
              System. out.println(TokenGenerator.generate(UUIDUtil. getUUIDStr()));;
       }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
算法实现如下: ```java public String[] convertLongToShort(String[] longUrl) { String[] shortUrl = new String[longUrl.length]; Map<String, String> keyMap = new HashMap<>(); String keyChars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; for (int i = 0; i < longUrl.length; i++) { // 计算key值 String url = longUrl[i]; long key = 1; for (char ch : url.toCharArray()) { key = (key * 64 + (int)ch) % 56800235584L; } // 遇到key值冲突则每次key值加1取余,直到不冲突为止 while (keyMap.containsKey(String.valueOf(key))) { key = (key + 1) % 56800235584L; } // 建立key值与6位字符的映射 StringBuilder sb = new StringBuilder("https://short.url/"); for (int j = 0; j < 6; j++) { int idx = (int)(key % 62); sb.append(keyChars.charAt(idx)); key /= 62; } // 映射字符不够六位,前面加0 while (sb.length() < "https://short.url/".length() + 6) { sb.insert(1, '0'); } String short = sb.toString(); shortUrl[i] = short; keyMap.put(String.valueOf(key), short); } return shortUrl; } public String[] convertShortToLong(String[] shortUrl) { String[] longUrl = new String[shortUrl.length]; Map<String, String> urlMap = new HashMap<>(); for (int i = 0; i < shortUrl.length; i++) { // 取出6位字符 String key = shortUrl[i].substring("https://short.url/".length()); // 反向计算key值 long num = 0; for (char ch : key.toCharArray()) { num = num * 62 + convertToNum(ch); } // 查找长地址 longUrl[i] = urlMap.get(String.valueOf(num)); } return longUrl; } public int convertToNum(char ch) { if (ch >= '0' && ch <= '9') { return ch - '0'; } else if (ch >= '

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值