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

PHP 的过来 帮看看

  •  
  •   xx3122 · 114 天前 · 2467 次点击
    这是一个创建于 114 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    建立一个成员对象 map ,然后 kv 形式存在 map 就可以了。这不适用于 fpm 架构下的 php ,你可以换个语言或者尝试 swoole,workerman 之类。这样就能满足 “而不是去数据库查找”
    brader
        11
    brader  
       113 天前
    理论上就是不可能的,一个 url ,光域名就挺长了,加上 path 、get 参数,想映射到 10 个字符,根本不够,就好比你想从 md5 逆出明文一样行不通
    zlhsvc
        12
    zlhsvc  
       113 天前
    不想去数据库可以 redis ,或者查文件。
    whyiyhw
        13
    whyiyhw  
       113 天前
    要求不用查库,就能解析的,试试对称加密 AES 系列函数,不过长度会超一点
    信息减少后,基本上没法还原成原始信息,比如 sha1 ,MD5,crc16/crc32 ,能还原的,就是信息压缩算法,通用的就那几种,其它都是领域专用,你可以往这个方向考虑。
    但是一般业务上做法,无非就是 生成短链接然后把 key => value 的映射保存到 内存中,常用中间件也就是 redis
    单机用 APC 扩展也行。
    shellus
        14
    shellus  
       113 天前
    @lscexpress 你忘了告诉他,用你这种方式,进程重启数据就丢失了,然后网站倒闭了
    lscexpress
        15
    lscexpress  
       113 天前
    @shellus 我还忘了告诉他,代码要在计算机上面运行,计算机要通电才能工作 。手动 doge
    Actrace
        16
    Actrace  
       113 天前
    法则:时间换空间,或者空间换时间。
    想要短字符串存储大量数据(说白了就是索引),那必然要建立映射。
    所有压缩算法都是如此。
    xx3122
        17
    xx3122  
    OP
       113 天前
    @Actrace 好的谢谢,上亿条,我怕数据库顶不住
    rm0gang0rf
        18
    rm0gang0rf  
       112 天前
    a-z . https http 换成固定映射成固定数字
    在用 hashids ,这个可以
    ztxcccc
        19
    ztxcccc  
       112 天前
    你要可逆的缩就只能有超大字典了,但是这样和你存映射有啥区别
    Joker520
        20
    Joker520  
       112 天前
    @xx3122 ElasticSearch 用起来
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   实用小工具   ·   2969 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 48ms · UTC 03:54 · PVG 11:54 · LAX 19:54 · JFK 22:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.