互联网搭车客
52871人加入此小组
发新帖

短链接是如何生成的?

由于微博的流行,短链接的应用变得非常广泛。
一直想知道短链接是怎么生成的,奇怪的是在百度问不到(只有一些生成器软件)
于是又来请教果壳了~
请问短链接生成算法的原理是怎样的?是不是现在大家都用的是不同的算法?(同一个链接发在豆瓣跟发在新浪的短链接就不一样)

评论 (9) 只看楼主

全部评论

  • 1楼
    2011-12-21 13:50 鲜肉粽子 C#程序设计师 只看Ta

    http://apps.hi.baidu.com/share/detail/42981312
    LZ找不到不到是不对的,你的[搜索]技能等级需要练啊

    [0] |
  • 2楼
    2011-12-21 13:53 鲜肉粽子 C#程序设计师 只看Ta

    顺便,在本地生成链接不一定有用。因为短链接需要解析,解析服务器有个类似hash表的东西在工作,所以一定要把有人发过的链接才能解析。不知道新浪等有没有提供解析接口。
    不知道我说清楚没?

    [0] |
  • 3楼
    2011-12-21 15:11 易凡 只看Ta
    引用@鲜肉粽子 的回应:http://apps.hi.baidu.com/share/detail/42981312
    LZ找不到不到是不对的,你的[搜索]技能等级需要练啊


    这贴我看了,是直接给的代码,java什么的我不懂~
    我想问的是算法的原理。

    我开始也以为是直接对网址的字符进行压缩成为短链接
    经过你这么一说,意思就好比短链接是长链接的快捷方式,是“地址”的“地址”?

    [0] |
  • 4楼
    2011-12-21 15:58 鲜肉粽子 C#程序设计师 只看Ta
    引用@易凡 的回应:

    这贴我看了,是直接给的代码,java什么的我不懂~
    我想问的是算法的原理。

    我开始也以为是直接对网址的字符进行压缩成为短链接
    经过你这么一说,意思就好比短链接是长链接的快捷方式,是“地址”的“地址”?

    是的啊,因为在短链服务提供商那里还要转回来的

    [0] |
  • 5楼
    2011-12-21 16:00 鲜肉粽子 C#程序设计师 只看Ta

    这种短链就是一种散列式的算法,是不可逆的函数,所以想要转回去的时候需要一张表来对应一下

    [0] |
  • 6楼
    2011-12-21 18:34 fengfeixue0219 植物分子生物学博士 只看Ta

    弱弱问一下是不是一个给定的短链接和一个长链接代表的网页是一一对应么?

    [0] |
  • 7楼
    2011-12-21 21:36 eggcar 古典吉他控,通信工程专业 只看Ta
    引用@fengfeixue0219 的回应:弱弱问一下是不是一个给定的短链接和一个长链接代表的网页是一一对应么?

    信息量角度讲不是的,不知道具体是Hash还是什么

    [0] |
  • 8楼
    2014-10-14 08:38 爱摄影的小牛 只看Ta

    好吧,我转一个,原文请猛戳:http://java-er.com/blog/short-link-create-suf/

    算法原理
    算法
    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算法,算法四可以算作是此算法的一种实现,此算法一般不会重复,但是如果是统计的话,就有很大问题,特别是对域名相关的统计,就抓瞎了.

    一个简单的python生成短链接的方法

    import hashlib  
     
    def get_md5(s):  
        s = s.encode('utf8') if isinstance(s, unicode) else s  
        m = hashlib.md5()  
        m.update(s)  
        return m.hexdigest()  
     
    code_map = (  
               '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'  
                )  
     
     
    def get_hash_key(long_url):  
        hkeys = []  
        hex = get_md5(long_url)  
        for i in xrange(0, 1):  
            n = int(hex[i*8:(i+1)*8], 16)  
            v = []  
            e = 0  
            for j in xrange(0, 8):  
                x = 0x0000003D & n  
                e |= ((0x00000002 & n ) >> 1) << j  
                v.insert(0, code_map[x])  
                n = n >> 6  
            e |= n << 5  
            v.insert(0, code_map[e & 0x0000003D])  
            hkeys.append(''.join(v))  
        return hkeys[0]  
     
    if __name__ == '__main__':  
        print get_hash_key('http://www.a2asdfasdfasfdbc.com')
    
    



    [0] |
  • 11楼
    2016-09-18 15:50 我喜欢可乐 只看Ta

    看了楼上几位的回答,基本可以满足小量的生成需求。

    如果大量的话,建议如下思路:

    长网址过来时,哈希一个id,id对应一个自增长的短网址。从aaaa自增长,大写字母、小写字母、阿拉伯数字。

    具体请参考http://980.so/https://www.zhihu.com/question/20188969

    [0] |

小组最新帖子

关于我们 加入果壳 媒体报道 帮助中心 果壳活动 免责声明 联系我们 移动版 移动应用

©果壳网    京ICP证100430号    京网文[2015] 0609-239号    新出发京零字东150005号     京公网安备11010502007133号

违法和不良信息举报邮箱:jubao@guokr.com    举报电话:13691127034    网上有害信息举报专区    儿童色情信息举报专区