`

Java版短网址(ShortUrl)的算法

阅读更多

最近,我的项目中需要用到短网址(ShortUrl)的算法,于是在网上搜索一番,发现有C#的算法,有.Net的算法,有PHP的算法,就是没有 找到Java版的短网址(ShortUrl)的算法,很是郁闷。同时还发现有不少网友在发帖求助,怎么实现Java版的短网址(ShortUrl)的算 法。干脆一不做,二不休,参考了一下网上比较流行的PHP版短网址(ShortUrl)算法:

http://www.snippetit.com/2009/04/php-short-url-algorithm-implementation/

再根据自己的理解,用Java实现了该短网址(ShortUrl)的算法。(\(^o^)/YES!我还真厉害!)

先来废话一下,是在别人的帖子上看到的,主要是让大家了解一下短网址(ShortUrl)。

时下,短网址应用已经在全国各大微博上开始流行了起来。例如QQ微博的url.cn,新郎的t.cn等。

我们在新浪微博上发布网址的时候,微博会自动判别网址,并将其转换,例如:http://t.cn/hrYnr0。为什么要这样做的,原因我想有这样几点:

1、微博限制字数为140字一条,那么如果我们需要发一些连接上去,但是这个连接非常的长,以至于将近要占用我们内容的一半篇幅,这肯定是不能被允许的,所以短网址应运而生了。

2、短网址可以在我们项目里可以很好的对开放级URL进行管理。有一部分网址可以会涵盖性、暴力、广告等信息,这样我们可以通过用户的举报,完全管理这个连接将不出现在我们的应用中,应为同样的URL通过加密算法之后,得到的地址是一样的。

3、我们可以对一系列的网址进行流量,点击等统计,挖掘出大多数用户的关注点,这样有利于我们对项目的后续工作更好的作出决策。

其实以上三点纯属个人观点,因为在我接下来的部分项目中会应用到,所以就了解了一下,下面先来看看短网址映射算法的理论(网上找到的资料):

① 将长网址用md5算法生成32位签名串,分为4段,,每段8个字符;

② 对这4段循环处理,取每段的8个字符, 将他看成16进制字符串与0x3fffffff(30位1)的位与操作,超过30位的忽略处理;

③ 将每段得到的这30位又分成6段,每5位的数字作为字母表的索引取得特定字符,依次进行获得6位字符串;

④ 这样一个md5字符串可以获得4个6位串,取里面的任意一个就可作为这个长url的短url地址。

很简单的理论,我们并不一定说得到的URL是唯一的,但是我们能够取出4组URL,这样几乎不会出现太大的重复。

首先,请大家了解在Java中如何用MD5来加密字符串得到32位的加密后的字符串,下面这个链接就是我已经封装好的Java MD5算法:

http://www.sunchis.com/html/java/javaweb/2011/0418/308.html

下面来看看程序部分:

// 获得短uuid  6位
    public static String getShortUUID() {
        String uuid = UUID.randomUUID().toString();
        String[] chars = new String[] { // 要使用生成URL的字符
        "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k",  "m", "n",
                 "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",
                  "2", "3", "4", "5", "6", "7", "8", "9" };
        String hex = Md5.getMD5(uuid);//32位 分成4段 随机抽出其中的一段做算法
        System.out.println(hex);
        String ShortStr = "";
        int i = random.nextInt(4);

        String outChars = "";
        int j = i + 1;
        String subHex = hex.substring(i * 8, j * 8); // 随机抽出一段字符串
        long idx = Long.valueOf("3FFFFFFF", 16) & Long.valueOf(subHex, 16);

        for (int k = 0; k < 6; k++) {
            int index = (int) (Long.valueOf("0000001f", 16) & idx);//这里的"000001f"不能大于数组chars的长度,并且让其二进制格式从左到右尽可能多的为1,取值一般为35,61,63
            outChars += chars[index];
            idx = idx >> 5;
        }
        
        ShortStr = outChars;

        return ShortStr;
    }

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics