zoukankan      html  css  js  c++  java
  • Java生成短链接

    因公司推广需要,需要一套短链接生成方案,正好前几天在MSDN看到有人发了一个.net版的短链接算法,我就把它转换成java版,拿出来共享一下

    生成思路:

    1.将"原始链接(长链接)+key(自定义字符串,防止算法泄漏)"MD5加密

    2.把加密字符按照 8 位一组 16 进制与 0x3FFFFFFF 进行位与运算,把得到的值与 0x0000003D 进行位与运算,取得字符数组 chars 索引,把取得的字符相加,每次循环按位右移 5 位,把字符串存入对应索引的输出数组(4组6位字符串)

    3.生成4以下的随机数,从输入数组中取出随机数对应位置的字符串,作为短链,存入数据库或者NoSql

    解析方式

    编写一个web处理程序,把从ur(如:http://url.51bi.com/zAnuAn)中解析短链接,将解析到的短链接(zAnuAn)与数据库中存入的原始链接进行匹配,跳转到匹配到的原始链接

    package com.bjdata.test;
    
    import java.security.MessageDigest;
    import java.util.Random;
    
    
    public class ShortUrlTest {
        public static void main(String[] args) {
            String sLongUrl = "http://www.51bi.com/bbs/_t_278433840/"; // 原始链接
            System.out.println("长链接:"+sLongUrl);
            String[] aResult = shortUrl(sLongUrl);//将产生4组6位字符串
            // 打印出结果
            for (int i = 0; i < aResult.length; i++) {
                System.out.println("[" + i + "]:" + aResult[i]);
            }
            Random random=new Random();
            int j=random.nextInt(4);//产成4以内随机数
            System.out.println("短链接:"+aResult[j]);//随机取一个作为短链
        }
    
        public static String[] shortUrl(String url) {
            // 可以自定义生成 MD5 加密字符传前的混合 KEY
            String key = "test";
            // 要使用生成 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 = md5ByHex(key + url);
    
            String[] resUrl = new String[4];
            for (int i = 0; i < 4; i++) {
    
                // 把加密字符按照 8 位一组 16 进制与 0x3FFFFFFF 进行位与运算
                String sTempSubString = hex.substring(i * 8, i * 8 + 8);
    
                // 这里需要使用 long 型来转换,因为 Inteper .parseInt() 只能处理 31 位 , 首位为符号位 , 如果不用long ,则会越界
                long lHexLong = 0x3FFFFFFF & Long.parseLong(sTempSubString, 16);
                String outChars = "";
                for (int j = 0; j < 6; j++) {
                    // 把得到的值与 0x0000003D 进行位与运算,取得字符数组 chars 索引
                    long index = 0x0000003D & lHexLong;
                    // 把取得的字符相加
                    outChars += chars[(int) index];
                    // 每次循环按位右移 5 位
                    lHexLong = lHexLong >> 5;
                }
                // 把字符串存入对应索引的输出数组
                resUrl[i] = outChars;
            }
            return resUrl;
        }
        /**
         * MD5加密(32位大写)    
         * @param src
         * @return
         */
        public static String md5ByHex(String src) {
            try {
                MessageDigest md = MessageDigest.getInstance("MD5");
                byte[] b = src.getBytes();
                md.reset();
                md.update(b);
                byte[] hash = md.digest();
                String hs = "";
                String stmp = "";
                for (int i = 0; i < hash.length; i++) {
                    stmp = Integer.toHexString(hash[i] & 0xFF);
                    if (stmp.length() == 1)
                        hs = hs + "0" + stmp;
                    else {
                        hs = hs + stmp;
                    }
                }
                return hs.toUpperCase();
            } catch (Exception e) {
                return "";
            }
        }
    
    }

    运行结果

    长链接:http://www.51bi.com/bbs/_t_278433840/
    [0]:fa6bUr
    [1]:ryEfeq
    [2]:zAnuAn
    [3]:auIJne
    短链接:zAnuAn
  • 相关阅读:
    LeetCode 40. Combination Sum II
    LeetCode 39. Combination Sum
    #Python学习#python虚拟环境——virtualenv
    #阿里云#云服务器部署Django(基础篇)
    驱动调试之打印
    Linux内核源码阅读记录一之分析存储在不同段中的函数调用过程
    uevent机制
    字符设备的另一种写法
    DM9000C网卡驱动程序编写与测试
    网卡驱动程序框架以及虚拟网卡驱动程序的实现
  • 原文地址:https://www.cnblogs.com/zhanghaoh/p/2831264.html
Copyright © 2011-2022 走看看