PHP 的过来 帮看看 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xx3122
V2EX    PHP

PHP 的过来 帮看看

  •  
  •   xx3122 2022-10-09 11:29:47 +08:00 3650 次点击
    这是一个创建于 1098 天前的主题,其中的信息可能已经有所发展或是发生改变。

    function code62($x) {
    $show = '';
    while ( $x > 0 ) {
    $s = $x % 62;
    if ($s > 35) {
    $s = chr ( $s + 61 );
    } elseif ($s > 9 && $s <= 35) {
    $s = chr ( $s + 55 );
    }
    $show .= $s;
    $x = floor ( $x / 62 );
    }
    rturn $show;
    }

    function shorturl($url) {
    $url = crc32 ( $url );
    $result = sprintf ( "%u", $url );
    return code62($result);
    }
    直接 echo shorturl("https://baidu.com"); = dXr5x1
    这是某个短网址的缩短方法

    请问有解析的方法不,比如根据 dXr5x1 解出 https://baidu.com ,而不是去数据库查找。根据上面这个怎么写出一个?谢谢求 demo

    20 条回复    2022-10-11 10:09:19 +08:00
    kingofzihua
        1
    kingofzihua  
       2022-10-09 11:33:33 +08:00
    crc32 是不可逆的,所以,没法解析
    xx3122
        2
    xx3122  
    OP
       2022-10-09 11:40:09 +08:00
    @kingofzihua 有类似的可以代替 crc32 的不?弄成可以解析出来的,字符 10 个以内就行
    kingofzihua
        3
    kingofzihua  
       2022-10-09 11:47:13 +08:00
    @xx3122 不清楚,我觉得不能
    qeqv
        4
    qeqv  
       2022-10-09 11:51:41 +08:00
    这么短的文本不可能压缩成更短的,你可能需要的是 Redis
    oldmyth
        5
    oldmyth  
       2022-10-09 11:59:01 +08:00
    无解,老老实实去数据库核对吧
    Kinnice
        6
    Kinnice  
       2022-10-09 12:03:02 +08:00
    首先缩短的网址,看一下网址的特征:
    比如可以这样
    https:// -> h
    http:// -> H
    .com -> c
    .cn -> C
    然后一一些重复的比如 bbbb -> 4B (域名不区分大小写因此可以利用一下)
    http://asdasbbbbbb.com -> Hasdas6Bc
    然后诸如此类
    kltt22
        7
    kltt22  
       2022-10-09 12:16:09 +08:00
    说一下使用场景,或许有别的解决方案
    MegrezZhu
        8
    MegrezZhu  
       2022-10-09 13:20:09 +08:00   3
    香农说不可以
    Light3
        9
    Light3  
       2022-10-09 13:31:22 +08:00
    听楼上的 直接 redis.. 你这种缩短 太麻烦了。。
    lscexpress
        10
    lscexpress  
       2022-10-09 14:03:47 +08:00
    这个跟 php 无关,但 php 的局限性也限制了你的思路。

    建立一个成员对象 map ,然后 kv 形式存在 map 就可以了。这不适用于 fpm 架构下的 php ,你可以换个语言或者尝试 swoole,workerman 之类。这样就能满足 “而不是去数据库查找”
    brader
        11
    brader  
       2022-10-09 14:07:05 +08:00
    理论上就是不可能的,一个 url ,光域名就挺长了,加上 path 、get 参数,想映射到 10 个字符,根本不够,就好比你想从 md5 逆出明文一样行不通
    zlhsvc
        12
    zlhsvc  
       2022-10-09 14:58:32 +08:00
    不想去数据库可以 redis ,或者查文件。
    whyiyhw
        13
    whyiyhw  
       2022-10-09 15:01:31 +08:00
    要求不用查库,就能解析的,试试对称加密 AES 系列函数,不过长度会超一点
    信息减少后,基本上没法还原成原始信息,比如 sha1 ,MD5,crc16/crc32 ,能还原的,就是信息压缩算法,通用的就那几种,其它都是领域专用,你可以往这个方向考虑。
    但是一般业务上做法,无非就是 生成短链接然后把 key => value 的映射保存到 内存中,常用中间件也就是 redis
    单机用 APC 扩展也行。
    shellus
        14
    shellus  
       2022-10-09 16:10:23 +08:00
    @lscexpress 你忘了告诉他,用你这种方式,进程重启数据就丢失了,然后网站倒闭了
    lscexpress
        15
    lscexpress  
       2022-10-09 16:19:55 +08:00
    @shellus 我还忘了告诉他,代码要在计算机上面运行,计算机要通电才能工作 。手动 doge
    Actrace
        16
    Actrace  
       2022-10-09 19:54:10 +08:00
    法则:时间换空间,或者空间换时间。
    想要短字符串存储大量数据(说白了就是索引),那必然要建立映射。
    所有压缩算法都是如此。
    xx3122
        17
    xx3122  
    OP
       2022-10-10 10:15:58 +08:00
    @Actrace 好的谢谢,上亿条,我怕数据库顶不住
    rm0gang0rf
        18
    rm0gang0rf  
       2022-10-10 14:13:36 +08:00
    a-z . https http 换成固定映射成固定数字
    在用 hashids ,这个可以
    ztxcccc
        19
    ztxcccc  
       2022-10-10 16:57:17 +08:00
    你要可逆的缩就只能有超大字典了,但是这样和你存映射有啥区别
    Joker520
        20
    Joker520  
       2022-10-11 10:09:19 +08:00
    @xx3122 ElasticSearch 用起来
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1388 人在线   最高记录 679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 16:49 PVG 00:49 LAX 09:49 JFK 12:49
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86