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

PHP 的过来 帮看看

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

    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 );
    }
    return $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   ·   实用小工具   ·   2608 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 04:50 · PVG 12:50 · LAX 20:50 · JFK 23:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.