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
1
kingofzihua 2022-10-09 11:33:33 +08:00
crc32 是不可逆的,所以,没法解析
|
2
xx3122 OP @kingofzihua 有类似的可以代替 crc32 的不?弄成可以解析出来的,字符 10 个以内就行
|
3
kingofzihua 2022-10-09 11:47:13 +08:00
@xx3122 不清楚,我觉得不能
|
4
qeqv 2022-10-09 11:51:41 +08:00
这么短的文本不可能压缩成更短的,你可能需要的是 Redis
|
5
oldmyth 2022-10-09 11:59:01 +08:00
无解,老老实实去数据库核对吧
|
6
Kinnice 2022-10-09 12:03:02 +08:00
首先缩短的网址,看一下网址的特征:
比如可以这样 https:// -> h http:// -> H .com -> c .cn -> C 然后一一些重复的比如 bbbb -> 4B (域名不区分大小写因此可以利用一下) http://asdasbbbbbb.com -> Hasdas6Bc 然后诸如此类 |
7
kltt22 2022-10-09 12:16:09 +08:00
说一下使用场景,或许有别的解决方案
|
8
MegrezZhu 2022-10-09 13:20:09 +08:00 3
香农说不可以
|
9
Light3 2022-10-09 13:31:22 +08:00
听楼上的 直接 redis.. 你这种缩短 太麻烦了。。
|
10
lscexpress 2022-10-09 14:03:47 +08:00
这个跟 php 无关,但 php 的局限性也限制了你的思路。
建立一个成员对象 map ,然后 kv 形式存在 map 就可以了。这不适用于 fpm 架构下的 php ,你可以换个语言或者尝试 swoole,workerman 之类。这样就能满足 “而不是去数据库查找” |
11
brader 2022-10-09 14:07:05 +08:00
理论上就是不可能的,一个 url ,光域名就挺长了,加上 path 、get 参数,想映射到 10 个字符,根本不够,就好比你想从 md5 逆出明文一样行不通
|
12
zlhsvc 2022-10-09 14:58:32 +08:00
不想去数据库可以 redis ,或者查文件。
|
13
whyiyhw 2022-10-09 15:01:31 +08:00
要求不用查库,就能解析的,试试对称加密 AES 系列函数,不过长度会超一点
信息减少后,基本上没法还原成原始信息,比如 sha1 ,MD5,crc16/crc32 ,能还原的,就是信息压缩算法,通用的就那几种,其它都是领域专用,你可以往这个方向考虑。 但是一般业务上做法,无非就是 生成短链接然后把 key => value 的映射保存到 内存中,常用中间件也就是 redis 单机用 APC 扩展也行。 |
14
shellus 2022-10-09 16:10:23 +08:00
@lscexpress 你忘了告诉他,用你这种方式,进程重启数据就丢失了,然后网站倒闭了
|
15
lscexpress 2022-10-09 16:19:55 +08:00
@shellus 我还忘了告诉他,代码要在计算机上面运行,计算机要通电才能工作 。手动 doge
|
16
Actrace 2022-10-09 19:54:10 +08:00
法则:时间换空间,或者空间换时间。
想要短字符串存储大量数据(说白了就是索引),那必然要建立映射。 所有压缩算法都是如此。 |
18
rm0gang0rf 2022-10-10 14:13:36 +08:00
a-z . https http 换成固定映射成固定数字
在用 hashids ,这个可以 |
19
ztxcccc 2022-10-10 16:57:17 +08:00
你要可逆的缩就只能有超大字典了,但是这样和你存映射有啥区别
|