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
![]() | 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 ![]() 香农说不可以 |
![]() | 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 你要可逆的缩就只能有超大字典了,但是这样和你存映射有啥区别 |