PHP 的过来 帮看看

2022-10-09 11:29:47 +08:00
 xx3122

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

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

建立一个成员对象 map ,然后 kv 形式存在 map 就可以了。这不适用于 fpm 架构下的 php ,你可以换个语言或者尝试 swoole,workerman 之类。这样就能满足 “而不是去数据库查找”
brader
2022-10-09 14:07:05 +08:00
理论上就是不可能的,一个 url ,光域名就挺长了,加上 path 、get 参数,想映射到 10 个字符,根本不够,就好比你想从 md5 逆出明文一样行不通
zlhsvc
2022-10-09 14:58:32 +08:00
不想去数据库可以 redis ,或者查文件。
whyiyhw
2022-10-09 15:01:31 +08:00
要求不用查库,就能解析的,试试对称加密 AES 系列函数,不过长度会超一点
信息减少后,基本上没法还原成原始信息,比如 sha1 ,MD5,crc16/crc32 ,能还原的,就是信息压缩算法,通用的就那几种,其它都是领域专用,你可以往这个方向考虑。
但是一般业务上做法,无非就是 生成短链接然后把 key => value 的映射保存到 内存中,常用中间件也就是 redis
单机用 APC 扩展也行。
shellus
2022-10-09 16:10:23 +08:00
@lscexpress 你忘了告诉他,用你这种方式,进程重启数据就丢失了,然后网站倒闭了
lscexpress
2022-10-09 16:19:55 +08:00
@shellus 我还忘了告诉他,代码要在计算机上面运行,计算机要通电才能工作 。手动 doge
Actrace
2022-10-09 19:54:10 +08:00
法则:时间换空间,或者空间换时间。
想要短字符串存储大量数据(说白了就是索引),那必然要建立映射。
所有压缩算法都是如此。
xx3122
2022-10-10 10:15:58 +08:00
@Actrace 好的谢谢,上亿条,我怕数据库顶不住
rm0gang0rf
2022-10-10 14:13:36 +08:00
a-z . https http 换成固定映射成固定数字
在用 hashids ,这个可以
ztxcccc
2022-10-10 16:57:17 +08:00
你要可逆的缩就只能有超大字典了,但是这样和你存映射有啥区别
Joker520
2022-10-11 10:09:19 +08:00
@xx3122 ElasticSearch 用起来

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/885473

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX