V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
wico77
V2EX  ›  问与答

如何将任意 url 转换成 10-12 个字符串

  •  
  •   wico77 · 2016-05-10 21:51:57 +08:00 · 3370 次点击
    这是一个创建于 2910 天前的主题,其中的信息可能已经有所发展或是发生改变。

    使用 python 或者 nodejs 都可以。

    32 条回复    2016-05-11 11:26:33 +08:00
    congeec
        1
    congeec  
       2016-05-10 22:00:10 +08:00
    你只能考虑短链接
    Bryan0Z
        2
    Bryan0Z  
       2016-05-10 22:03:58 +08:00 via Android
    ASCII 当成 unicode 显示,字符数应该可以减到以前的 1/3 ,然后再压缩下,够呛
    短链接更适合你
    chairuosen
        3
    chairuosen  
       2016-05-10 22:10:24 +08:00
    如果你掌握了这个方法,那么你可以把任意数据拼到 url 里,然后用这个方法转换成 10-12 个字符。无限压缩率?
    murmur
        4
    murmur  
       2016-05-10 22:39:42 +08:00
    你晓得合法的 url 最长有多长么?压缩到 10-12 ? 100-120 都很了不起了
    Slienc7
        5
    Slienc7  
       2016-05-10 23:05:56 +08:00 via Android
    md5 + substr
    lululau
        6
    lululau  
       2016-05-10 23:16:07 +08:00
    @murmur 你告诉我合法的 URL 是多长吧,哪部法律?
    Pastsong
        7
    Pastsong  
       2016-05-10 23:34:40 +08:00
    @lululau https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.2.1

    > Note: Servers ought to be cautious about depending on URI lengths
    above 255 bytes, because some older client or proxy
    implementations might not properly support these lengths.
    upczww
        8
    upczww  
       2016-05-10 23:48:36 +08:00 via Smartisan T1
    找个短链接 api 吧,渣浪的就挺好
    lululau
        9
    lululau  
       2016-05-11 00:09:06 +08:00 via iPhone
    @Pastsong 这句话能说明 256 个字节的 URI 就是不合法的了?
    wico77
        10
    wico77  
    OP
       2016-05-11 00:45:51 +08:00
    一个字符有 a-zA-Z0-9, 62 个变化, 62 的 12 次方足够应对现有的互联网的网页 url 了吧
    @Slienc7 md5+substr ,这种方法不可逆呀。
    wico77
        11
    wico77  
    OP
       2016-05-11 00:46:26 +08:00
    @congeec 话说短链接是怎么缩小到 10 几个字符的呢
    ligyxy
        12
    ligyxy  
       2016-05-11 00:50:38 +08:00
    @wico77 你想要可逆?确定?
    tSQghkfhTtQt9mtd
        13
    tSQghkfhTtQt9mtd  
       2016-05-11 00:50:41 +08:00 via Android
    @wico77 访问短链接->短链接服务查询对应长链接(你自己写进去的)-> 301/302 Moved
    lslqtz
        14
    lslqtz  
       2016-05-11 01:02:32 +08:00 via iPhone
    @Slienc7 我第一个也是想到这个。
    lslqtz
        15
    lslqtz  
       2016-05-11 01:04:30 +08:00 via iPhone
    md5+substr 将 substr 后的放到数据库 url 也放进数据库 ruok
    wico77
        16
    wico77  
    OP
       2016-05-11 01:42:14 +08:00
    @lslqtz 好方法。
    ob
        17
    ob  
       2016-05-11 07:29:13 +08:00 via Android
    @lslqtz 你这方法有点把问题复杂化了,如果单纯只是转 10 个字符串,既然用到本地数据库,为什么不直接弄张对应表,一个 url ,一个自增长的 id ,前面需要的话可以补零。当然多台台服务器同步的另说。
    congeec
        18
    congeec  
       2016-05-11 07:43:00 +08:00
    @wico77 哈希呗,然后把哈希后的字符串和原始 URL 用键值对保存起来
    murmur
        19
    murmur  
       2016-05-11 07:58:37 +08:00
    @lululau IE 是 2083 所以你单纯用 url 做映射索引效率低死 肯定有一次 hash 再比较 url
    Havee
        20
    Havee  
       2016-05-11 08:32:26 +08:00   ❤️ 1
    楼上有人将 url uri 搞混了
    loading
        21
    loading  
       2016-05-11 08:39:11 +08:00 via Android
    数据库,一列是原来的 url ,一列是缩短的。
    这样楼主应该明白了,并不是压缩。,只是映射关系。
    heaton_nobu
        22
    heaton_nobu  
       2016-05-11 09:11:00 +08:00
    UrlRewrite ,要是自己写就存一份对应关系,不自己写就调用外部 api
    Lucius
        23
    Lucius  
       2016-05-11 09:22:47 +08:00
    如果你们讨论出了方案 请告诉我。。
    我想参考你们的方案 设计出把“任意蓝光电影转换成 10-12 个字符串”的算法。 然后去申请诺贝尔物理学奖
    GTim
        24
    GTim  
       2016-05-11 09:35:13 +08:00
    用自增的话建议 base36[0-9a-z]自家用,基本上足够,然后要保存三元组(id,md5_hash,raw_url)
    dapang1221
        25
    dapang1221  
       2016-05-11 10:24:09 +08:00
    @Lucius 看来必须要在开个诺贝尔魔法学奖了 2333
    soland
        26
    soland  
       2016-05-11 10:45:39 +08:00
    255 字节
    Thoxvi
        27
    Thoxvi  
       2016-05-11 10:47:23 +08:00 via Android
    数据库索引?
    dixyes
        28
    dixyes  
       2016-05-11 11:01:41 +08:00 via Android
    我萌人类拍了多少部蓝光电影啊
    假定有 1000w 部=1E7 部 吧
    12 位 ascii 码有 7.92281625E28 组合 可行 可打印字符的话有 4.75920314E23 组合 似乎也可行((
    可以假定有一种算法可以实现 4.76E23 个数到 1E7 的映射 只不过这个算法做出来目测可能比 1E7 部电影还大
    dixyes
        29
    dixyes  
       2016-05-11 11:03:08 +08:00 via Android
    今年的诺贝尔扯淡学奖是我的了
    lincanbin
        30
    lincanbin  
       2016-05-11 11:04:19 +08:00
    你需要一个数据库。
    lincanbin
        31
    lincanbin  
       2016-05-11 11:06:23 +08:00
    但是这样也不会是任意 URL ,如果你用大小写字母加数字的话,也就最多映射(26*2+10)^10 个 URL 为 10 位以下的字符。
    lslqtz
        32
    lslqtz  
       2016-05-11 11:26:33 +08:00
    @ob 是复杂化了,但是我是直接想我能想到的最简单的方式来的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3604 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 00:50 · PVG 08:50 · LAX 17:50 · JFK 20:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.