V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
daijinming
V2EX  ›  程序员

如何让 URL 变得更短

  •  
  •   daijinming · 2018-11-23 13:16:50 +08:00 · 4214 次点击
    这是一个创建于 2193 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这里有一个 URL http://elef.top/11918780727494821840.code,其中 11918780727494821840 感觉太长,用什么算法可以把这一堆字符串变得更短,并且还能恢复成原来的字符串

    29 条回复    2018-11-23 16:20:18 +08:00
    likuku
        1
    likuku  
       2018-11-23 13:21:16 +08:00
    各种开源的短域名产品源代码参考下呗,能用现成的短域名服务,那就直接用吧。
    sxlzll
        2
    sxlzll  
       2018-11-23 13:21:25 +08:00
    google 关键词 短链接 算法
    zj9495
        3
    zj9495  
       2018-11-23 13:21:41 +08:00
    http://t.删除 cn/E2Drs42
    idtaanlcoe
        4
    idtaanlcoe  
       2018-11-23 13:22:45 +08:00 via Android
    直接转短链接不就好了?
    rayhy
        5
    rayhy  
       2018-11-23 13:33:45 +08:00
    楼主需要的应该是压缩算法而不是短链接那一套吧。

    帮楼主试了下 lzma,反而变长了。。
    base64.b64encode(lzma.compress(bytes("11918780727494821840",encoding="utf-8"), format=lzma.FORMAT_ALONE, preset=9))

    得到:XQAAAAT//////////wAY4OBiO21o/h1HKGV0+oVxG2+9c8sg21/9bgQA
    fyyz
        6
    fyyz  
       2018-11-23 13:36:29 +08:00 via Android
    这个 url 里最后那段只有数字,可以考虑加上大小写字母,把十进制变成 62 进制
    mm163
        7
    mm163  
       2018-11-23 13:36:45 +08:00
    把数字部分转换成 62 进制或 64 进制,大概可以缩小一半吧。
    largecat
        8
    largecat  
       2018-11-23 13:37:12 +08:00 via Android
    md5
    hoythan
        9
    hoythan  
       2018-11-23 13:37:18 +08:00
    10 进制转 32 进制

    11918780727494821840 => aaq03thd1ji00
    hoythan
        10
    hoythan  
       2018-11-23 13:38:12 +08:00   ❤️ 4
    fyyz
        11
    fyyz  
       2018-11-23 13:39:14 +08:00 via Android
    还有,最后的 .code 也太长了,如果一定要标识后缀可以压缩成.c
    xy2401
        12
    xy2401  
       2018-11-23 13:46:54 +08:00
    同问。想在 url 里面放 json。压缩一下 分享。有什么比较原生到方法吗? 30%压缩率
    Chappako
        13
    Chappako  
       2018-11-23 13:50:08 +08:00   ❤️ 1
    搜索 hashids
    hoythan
        14
    hoythan  
       2018-11-23 14:04:04 +08:00
    @largecat md5 咋还原???????还得建一个数据库吗,建数据库就没有压缩的意义了啊
    sutra
        15
    sutra  
       2018-11-23 14:23:24 +08:00   ❤️ 1
    10 进制换成 64 进制试试:
    import java.math.BigInteger;

    import org.apache.commons.codec.binary.Base64;

    public class Dec2Base64 {

    public static void main(String[] args) {
    BigInteger n = new BigInteger("11918780727494821840");
    String s = Base64.encodeBase64URLSafeString(n.toByteArray());
    System.out.println(s);
    System.out.printf("before length: %d, after length: %d\n", n.toString().length(), s.length());

    BigInteger n1 = new BigInteger(Base64.decodeBase64(s));
    System.out.println(n1);
    System.out.println(n.equals(n1));
    }

    }


    AKVoA-xaGcfQ
    before length: 20, after length: 12
    11918780727494821840
    true
    xi2008wang
        16
    xi2008wang  
       2018-11-23 14:23:56 +08:00
    用了一下你的服务,发现还可以通过 id 取查,那不是把别人的也查出来了。。。
    daijinming
        17
    daijinming  
    OP
       2018-11-23 14:26:22 +08:00
    @Chappako
    $id = $hashids->encode(1191878072,7494821840);
    var_dump($id);
    string(15) "WWZmko6C22VRl7K"
    短了 5 位
    daijinming
        18
    daijinming  
    OP
       2018-11-23 14:29:06 +08:00
    @xi2008wang 这些信息就是用来共享的,没关系的,短地址当天有效,长地址也就是 11918780727494821840 是根据文件 hash 值生成的,没有规律可循
    daijinming
        19
    daijinming  
    OP
       2018-11-23 14:30:22 +08:00
    @sutra 这个看来是最短了
    webdisk
        20
    webdisk  
       2018-11-23 14:36:12 +08:00
    @hoythan
    26 是 26 个字母
    36 是数字加字母
    52 是大小写字母
    62 是大小写字母加数字

    但是这个 58 是什么意思
    BOYPT
        21
    BOYPT  
       2018-11-23 14:39:48 +08:00
    想压缩效率最高,就得看这个 id 有没有什么规律,然后根据规律设计算法吧。

    我做过个用 mongoid 的记录 id 放 url 的,mongoid 是 24 位 16 进制,有几位固定机器码,然后是时间戳,然后几位随机那样;

    机器码固定默认、然后时间戳可以把范围缩小到特定的几年内,最后只记录随机数,最后缩短成 6 位 64 进制好像。时间太久不大记得
    chocotan
        22
    chocotan  
       2018-11-23 14:41:07 +08:00
    hashid+1
    BOYPT
        23
    BOYPT  
       2018-11-23 14:42:07 +08:00
    @webdisk #20 是大小写字母加数字 64 减去 oO0Il1 几个容易视觉混淆的字母吧
    flynaj
        24
    flynaj  
       2018-11-23 14:45:01 +08:00 via Android
    map 一个表保保存,微软就是这样做的
    sutra
        25
    sutra  
       2018-11-23 14:50:35 +08:00
    @hoythan 输入参数和 10 进制输出不一样?什么算法?
    50vip
        26
    50vip  
       2018-11-23 15:31:46 +08:00
    100 进制试试看!
    jfcherng
        27
    jfcherng  
       2018-11-23 15:35:15 +08:00
    寫了個玩具練手 https://gist.github.com/jfcherng/44fe9183a657758df455da5a575bdaa8

    Encoded: W7tuQpX~lnH
    # of chars saved: 9
    auv1107
        28
    auv1107  
       2018-11-23 15:52:25 +08:00
    存个表
    deadEgg
        29
    deadEgg  
       2018-11-23 16:20:18 +08:00
    我以前被面试的时候想了一种短链接的实现方式

    可以用 trie 树去实现,简单容易理解,优点多多,缺点就是内存占用大
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2582 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 15:35 · PVG 23:35 · LAX 07:35 · JFK 10:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.