微博URL短网址生成算法原理及(java版、php版实现实例)

短网址(Short URL),顾名思义就是在形式上比较短的网址。通常用的是asp或者php转向,在Web 2.0的今天,不得不说,这是一个潮流。目前已经有许多类似服务,借助短网址您可以用简短的网址替代原来冗长的网址,让使用者可以更容易的分享链接。
例如:http://t.cn/SzjPjA

短网址服务,可能很多朋友都已经不再陌生,现在大部分微博、手机邮件提醒等地方已经有很多应用模式了,并占据了一定的市场。估计很多朋友现在也正在使用。
看过新浪的短连接服务,发现后面主要有6个字符串组成,于是第一个想到的就是原来公司写的一个游戏激活码规则,也就是下面的算法2,
26个大写字母 26小写字母,10个数字,随机生成6个然后插入数据库对应一个id,短连接跳转的时候,根据字符串查询到对应id,即可实现相应的跳转!不过2的62次方,不知道有没有重复的,小概率可以,但是对应不是很大的网站应该足够了
自从twitter推出短网址(shorturl),继之国内各大微博跟风,google公开goo.gl使用API,短网址之风愈演愈烈.不得不说这是一个新兴又一大热门web2.0服务.现整理一下,包括完整短网址网站,短网址生成原理,算法举例,以及优劣比较,同时还介绍几个phper个人实现的。

短链接的好处:

1、内容需要;2、用户友好;3、便于管理。

为什么要这样做的,原因我想有这样几点:
微博限制字数为140字一条,那么如果我们需要发一些连接上去,但是这个连接非常的长,以至于将近要占用我们内容的一半篇幅,这肯定是不能被允许的,所以短网址应运而生了。
短网址可以在我们项目里可以很好的对开放级URL进行管理。有一部分网址可以会涵盖暴力,广告等信息,这样我们可以通过用户的举报,完全管理这个连接将不出现在我们的应用中,应为同样的URL通过加密算法之后,得到的地址是一样的。
我们可以对一系列的网址进行流量,点击等统计,挖掘出大多数用户的关注点,这样有利于我们对项目的后续工作更好的作出决策。

算法原理
算法一
1)将长网址md5生成32位签名串,分为4段, 每段8个字节;
2)对这四段循环处理, 取8个字节, 将他看成16进制串与0x3fffffff(30位1)与操作, 即超过30位的忽略处理;
3)这30位分成6段, 每5位的数字作为字母表的索引取得特定字符, 依次进行获得6位字符串;
4)总的md5串可以获得4个6位串; 取里面的任意一个就可作为这个长url的短url地址;
这种算法,虽然会生成4个,但是仍然存在重复几率,下面的算法一和三,就是这种的实现.
算法二
a-zA-Z0-9 这64位取6位组合,可产生500多亿个组合数量.把数字和字符组合做一定的映射,就可以产生唯一的字符串,如第62个组合就是aaaaa9,第63个组合就是aaaaba,再利用洗牌算法,把原字符串打乱后保存,那么对应位置的组合字符串就会是无序的组合。
把长网址存入数据库,取返回的id,找出对应的字符串,例如返回ID为1,那么对应上面的字符串组合就是bbb,同理 ID为2时,字符串组合为bba,依次类推,直至到达64种组合后才会出现重复的可能,所以如果用上面的62个字符,任意取6个字符组合成字符串的话,你的数据存量达到500多亿后才会出现重复的可能。
具体参看这里彻底完善新浪微博接口和超短URL算法,算法四可以算作是此算法的一种实现,此算法一般不会重复,但是如果是统计的话,就有很大问题,特别是对域名相关的统计,就抓瞎了。

java语言实现:
Java代码
package com.test;

import java.security.MessageDigest;

public class ShortURL {

private final static String[] hexDigits = {
      "0", "1", "2", "3", "4", "5", "6", "7",
      "8", "9", "a", "b", "c", "d", "e", "f"}; 

    public 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 hexDigits[d1] + hexDigits[d2];
    }

    public static String MD5Encode(String origin){
        String resultString = null;
            try {

                resultString=new String(origin);
                MessageDigest md = MessageDigest.getInstance("MD5");

                resultString.trim();

                resultString=byteArrayToHexString(md.digest(resultString.getBytes("UTF-8")));
            }catch (Exception ex){}
            return resultString;
        }

public static void main(String[] args) {
    String url = "http://www.bai.com";
    for (String string : ShortText(url)) {
        print(string);
    }
} 

public static String[] ShortText(String string){
    String key = "XuLiang";                 //自定义生成MD5加密字符串前的混合KEY
    String[] chars = new String[]{          //要使用生成URL的字符
        "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"
    }; 

    String hex = MD5Encode(key + string);
    int hexLen = hex.length();
    int subHexLen = hexLen / 8;
    String[] ShortStr = new String[4]; 

    for (int i = 0; i < subHexLen; i++) {
        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("0000003D", 16) & idx);
            outChars += chars[index];
            idx = idx >> 5;
        }
        ShortStr[i] = outChars;
    } 

    return ShortStr;
} 

public static void print(Object messagr){
    System.out.println(messagr);
}

}

以下为php语言实现:
Php代码
function shorturl($input) {
$base32 = array (

‘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‘
);

$hex = md5($input);
$hexLen = strlen($hex);
$subHexLen = $hexLen / 8;
$output = array();
for ($i = 0; $i < $subHexLen; $i++) {

$subHex = substr ($hex, $i * 8, 8);
$int = 0x3FFFFFFF & (1 * (‘0x‘.$subHex));
$out = ‘‘;
for ($j = 0; $j < 6; $j++) {
  $val = 0x0000001F & $int;
  $out .= $base32[$val];
  $int = $int >> 5;
}
$output[] = $out;

}
return $output;
}
?>

Php代码
function random($length, $pool = ‘‘)

{
    $random = ‘‘;
    if (emptyempty($pool)) {
        $pool    = ‘abcdefghkmnpqrstuvwxyz‘;
        $pool   .= ‘23456789‘;
    }
    srand ((double)microtime()*1000000);
    for($i = 0; $i < $length; $i++)
    {
        $random .= substr($pool,(rand()%(strlen ($pool))), 1);
    }
    return $random;
}

?>

跳转原理
当我们生成短链接之后,只需要在表中(数据库或者NoSql )存储原始链接与短链接的映射关系即可。当我们访问短链接时,只需要从映射关系中找到原始链接,即可跳转到原始链接。

微博URL短网址生成算法原理及(java版、php版实现实例)

时间: 2024-09-29 20:46:26

微博URL短网址生成算法原理及(java版、php版实现实例)的相关文章

微博短网址生成算法原理

短网址(Short URL),顾名思义就是在形式上比较短的网址.通常用的是asp或者php转向,在Web 2.0的今天,不得不说,这是一个潮流.目前已经有许多类似服务,借助短网址您可以用简短的网址替代原来冗长的网址,让使用者可以更容易的分享链接. 例如:http://980.so/3u0JzX 表示http://www.ganmall.com.cn/h/detail/dp_928.html?chl=dwz9801 短网址服务,可能很多朋友都已经不再陌生,现在大部分微博.手机邮件提醒等地方已经有很

php短网址生成算法

<?php //短网址生成算法 class ShortUrl { //字符表 public static $charset = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; public static function encode($url) { $key = 'abc'; //加盐 $urlhash = md5($key . $url); $len = strlen($urlhash); /

用PHP实现URL转换短网址的算法示例

短网址就是把一个长的地址转换在超级短的网址,然后访问短网址即可跳转到长网址了,下面来看用PHP实现URL转换短网址的算法与例子. 短网址(Short URL) ,顾名思义就是在形式上比较短的网址.在Web 2.0的今天,不得不说,这是一个潮流.目前已经有许多类似服务,借助短网址您可以用简短的网址替代原来冗长的网址,让使用者可以更容易的分享链接. 算法原理 1)将长网址md5生成32位签名串,分为4段, 每段8个字节;2)对这四段循环处理, 取8个字节, 将他看成16进制串与0x3fffffff(

URL短网址系统的算法设计及实践

在通常情况下,URL是由系统生成的,通常包括URI路径,多个查询参数,可以对参数进行加密和解密.当人们要分享某个URL,比如短信,邮件,社交媒体,这就需要短URL. 而短网址,顾名思义就是在长度上比较短的网址.简单来说就是帮您把冗长的URL地址缩短成8个字符以内的短网址. 你有没有遇到过短信字符过长本来一条信息搞定的事情需要发两条?你有没有遇到过填报系统里填写网址却因为字符限制无法完整提交?你有没有遇到过排版好的内容由于链接过长而完全打乱了美感? 这时候,你就需要用到短网址生成工具了. 如开发者

微信(url.cn)短网址生成api接口以及php,python的调用方法

微信营销中,原链接太长总是很不方便分享,转化率极低.所以我们一般使用微信短链接即url.cn的短网址样式来缩短我们的链接,再发布到微信平台进行链接分享,今天给大家分享一个微信短链接生成接口,以及微信url.cn短网址的生成方式. 微信短链接生成api接口: http://qingmeidwz.cn/wxshorturl.php?url_long=http://www.baidu.com 使用说明: 将api接口地址中 "http://www.baidu.com" 换成需要缩短的网址,然

2020最新新浪短网址生成API接口与在线网址缩短工具分享与介绍

新浪短链接已经广泛应用于各大平台营销之中.如:微信,短信,微博已经各论坛广告软文之中.因为其超短的t.cn的样式,更容易让人接收和保证的文案的美观性.但是自新浪停止了对外开放的api key之后,市面上还有哪些可以继续生成新浪短链接的api接口呢?别担心,今天给大家分享一款我自己一直在使用的新浪短链接在线批量网址缩短工具和api接口. 一,在线批量生成新浪短网址工具:     1,工具地址:http://qingmeidwz.cn 使用步骤:         1,进入新浪短网址批量生成工具网站(

最新官方新浪短网址生成API接口与在线短网址缩短工具分享

新浪短链接已经广泛应用于各大平台营销之中.如:微信,短信,微博已经各论坛广告软文之中.因为其超短的t.cn的样式,更容易让人接收和保证的文案的美观性.但是自新浪停止了对外开放的api key之后,市面上还有哪些可以继续生成新浪短链接的api接口呢?别担心,今天给大家分享一款我自己一直在使用的新浪短链接在线批量网址缩短工具和api接口. 一,在线批量生成新浪短网址工具: 1,工具地址:http://qingmeidwz.cn 使用步骤: 1,进入新浪短网址批量生成工具网站 http://qingm

超赞!最新短网址生成接口(新浪、腾讯官方api)

简要描述 短网址,顾名思义就是一种较短域名加动态参数组成的短地址,类似于t.cn/xxxx,url.cn/xxx.是由各大平台诸如新浪.腾讯.百度发布的短网址接口将长网址转换而来的. 应用场景 短网址的应用场景很广,譬如短信营销.邮件推广.微信营销.QQ营销.自媒体推广.渠道推广等,都会用到短网址.究其原因是在于短网址可以降低推广成本.用户记忆成本,提高用户点击率:在特定的场景下推广还能规避关键词,防止域名被拦截,隐藏真实地址等. 短网址生成接口 1.新浪短网址接口(最新官方api) http:

一致性Hash算法原理,java实现,及用途

学习记录: 一致性Hash算法原理及java实现:https://blog.csdn.net/suifeng629/article/details/81567777 一致性Hash算法介绍,原理,及使用场景:https://blog.csdn.net/cbmljs/article/details/88021598 纯转载,侵删 原文地址:https://www.cnblogs.com/dupei/p/12054368.html