例如有一串很长的 JSON 字符串 '{"x":5,"y":6}'
,我想转为短链,并且拿到短链的还能反编译为原值。考虑了几个压缩的库发现字符串长度并不会更短,甚至还会更长。
那其实应该是需要先进行把能精简长度的尽量精简,比如 key ,然后再进行一定的规则转为短链而不是单纯的压缩,有大佬能谈一下这个转换的规则吗? Javascript 库或者算法都可以。
另外我了解现在的短链大部分是有服务端参与存储在数据库里面的,但是有无纯前端的方案呢?
![]() | 1 Goooooos 333 天前 短链接 跟 字符串压缩没事关系吧? |
![]() | 3 b821025551b 333 天前 你在说神马? |
![]() | 4 shintendo 333 天前 额,你难道认为短链是把长链压缩出来的吗 |
![]() | 5 zzlit OP @b821025551b 就是比如我想对这个字符串 '{"x":5,"y":6}' 变成 'xxxx', 然后 'xxxx' 还能还原为'{"x":5,"y":6}',长度尽可能短,所以用了短链的概念 |
![]() | 7 meeop 333 天前 没有 数据可以压缩,但不会有魔法般的将任何信息变成一个固定长度 key 的方法 但是你可以将数据上传任何 cdn ,然后会得到一个固定长度下载链接 |
8 xz410236056 333 天前 |
![]() | 9 shintendo 333 天前 ![]() 如果你这个 JSON 是完全任意内容,而不是固定的 pattern ,或者大量重复的 key 的话,很难想象能怎么压缩。 退一步想想,如果有这么一个稳定无损缩短 JSON 的算法,现在的前后端 ajax 通信为啥不用上呢?要不你看看 gzip 吧 |
![]() | 10 DigitaIOcean 333 天前 @zzlit #6 哈哈哈哈 |
![]() | 11 nzynzynzy 333 天前 传输和存储是两件事,我有点没弄清楚你要传输方便还是要存储到一个地方然后访问? |
![]() | 12 miaotaizi 333 天前 布隆过滤器? |
![]() | 13 iorilu 333 天前 压缩是压缩 短链是短链 难道你认为短链可以做到压缩得功能 要真有让 json 压缩并能还原, 那任何地方不都能用上 |
![]() | 15 COW 333 天前 via Android 其实就是想把一个 id 映射到 json 字符串呗,那只要你做了 kv 存储,就能相互转换,至于短链长什么样跟你的 id 生成规则有关 |
![]() | 16 cheng6563 333 天前 ![]() 先 urlencode 下,{"x":5,"y":6 转成 %7B%22x%22%3A5%2C%22y%22%3A6%7D 然后随便做个 url https://example.com/?json=%7B%22x%22%3A5%2C%22y%22%3A6%7D 把这个 url 随便发个微博,把微博生成的短链接复制出来 |
![]() | 17 nzynzynzy 333 天前 @zzlit #14 传输就最多是 minify (去掉空格)就到头了吧,我感觉是这样了。如果 A-->B 传输就这样了。如果能,就精简一下 json 的内容,荣誉的东西不要。 我感觉很多开发时候 json 都是脱裤级别的存在,不要这样,要精简,一次数据太多要翻页。 |
![]() | 18 otakustay 333 天前 先按 UTF8 编码走 gzip (或者其它任意压缩算法)一下,然后再转成 hex (或者其它更高效的表达)? |
19 kzfile 333 天前 其实就是需要按照你的业务特性,设计一种高效的数据编码/解码算法 |
![]() | 23 siweipancc 333 天前 via iPhone 害怕……哪有这么玩的 |
![]() | 24 cmdOptionKana 333 天前 感觉是个 XY 问题,建议说出最终是想做什么。 |
![]() | 25 systemGuest 333 天前 @meeop MD5:你在讲什么? |
![]() | 26 systemGuest 333 天前 数据库设计个表 id(自增 ID),md5(唯一索引),json(实际内容) 3 个字段 假如 json={"x":5,"y":6} ,md5 就是 {"x":5,"y":6}=225a399a7b45045f ,如果这个 md5 不存在就把 md5 和 json 内容写到表里,返回了自增 ID 1 ,你可以生成短连接 url/1 ,用户访问这个短连接 你也可以通过携带的 1 反查自增 id=1 json 内容 |
![]() | 27 ixcode 333 天前 你的需求是数据压缩,短链接是一个 a->b 的映射。 json 本身不是一个高效率的格式,他的优点是可读性好。光看那些引号就知道有多浪费空间了。 |
![]() | 28 MoYi123 333 天前 请学习数论入门课题之抽屉原理(说难听点是小学奥数的内容) |
29 0o0o0o0 333 天前 短链 反编译(我理解为解码) 说明你是要拿到这个 url 走自己的程序解码,并且尽可能看起来短 那直接用 https://example.com/[所有编码内容] 编码的字符直接用除了 [url 保留字符] 的所有其他字符就好了。 hex 是 16 进制,你完全可用 0-9 a-z A-Z -_.~ 做一个 66 进制。 再大胆一点,利用常用汉字做个 2048 进制,虽然汉字实际存储占用很大,但是看起来短就行。 |
30 ink19 333 天前 @systemGuest #25 md5 是摘要算法,损失了数据的 |
31 SilentRhythm 333 天前 1. 字典表 2. 网络传输考虑 protobuf 或 gzip 3. 如果是简单对象,可以考虑 url query string ,如 x=5&y=6 ,有一定可读性 |
32 0o0o0o0 333 天前 @0o0o0o0 想错了,常用汉字可以做 4096 进制,也就是 12 位二进制作为一个汉字,但是汉字是全角字符,视觉上占用两个半角字符,“压缩比”大概是 6. 如果是 url 非保留字符 可以 64 进制,也就是 6 位二进制作为一个字符,所以还是用 0-9 a-z A-Z -_.~ 做一个 64 进制的就好了。 用 hex 的话是 4 位二进制作为一个字符,用 url 非保留字符相比 hex 可以缩短 1/3 |
33 0o0o0o0 333 天前 “考虑了几个压缩的库发现字符串长度并不会更短,甚至还会更长。” 是因为即使是 ascii 范围的字符也有 128 个,而转成 hex 之后,hex 只有 16 个字符,相当于你压缩完只有原来的 1/8 大小才能不变短。 |
![]() | 35 darkengine 333 天前 信息论的东西 |
![]() | 36 frankly123 333 天前 JOSN 文件,往 CDN 传,文件名拼接到链接上 |
![]() | 37 molvqingtai 333 天前 |
38 JShen 333 天前 @systemGuest #26 你这个有漏洞的,最好还是返回 md5 ,因为 id 会让人爬完。并且无法应对大量的短链。后续分表不好使 |
![]() | 39 InkAndBanner 333 天前 如果真能实现 ,恭喜你发现了世界上最先进的压缩算法 |
![]() | 40 jydeng 333 天前 你可以搜一下 lz-string ,但也不可能压缩成短链。 |
41 niubilewodev 333 天前 via iPhone XY 问题,说出你的真实需求。 |
![]() | 42 lambdaq 333 天前 如果 json 结构很杂乱,纯粹为了节省 URL 空间,那么 kibana 那套方案可以参考下 https://github.com/betodealmeida/python-rison 比如 {'foo': 'bar'} 压缩后: (foo:bar) |
![]() | 43 vkZudze5p1h4py5H 333 天前 做个数据库呗,json 存数据库里,返回 id 。 |
![]() | 45 opengps 333 天前 要知道,json 的诞生是由 xml 驱动的,所以要是有更短的格式肯定不会是现在的 2 局面 |
![]() | 46 zzlit OP @cmdOptionKana @niubilewodev 多谢大佬的回复,我需求就是脱离服务端的存储,从前端进行数据传递,是因为打羽毛想到的一个轮转对局的算法,我写出来了但是只能我自己“单机”看,所以就想到有没有这种途径,我把对局信息处理为短链,然后发给大家,大家可以进行反编译拿到对局信息,至于反编译的工具或者说平台就很简单了,现在就是卡在处理数据这一步 |
![]() | 48 cmdOptionKana 333 天前 |
![]() | 49 cmdOptionKana 333 天前 感觉你可以通过网盘之类的方式,直接分享文件。或者索性直接自己建个网站算了,没有自己的服务器,很多事情都束手束脚。 |
![]() | 50 systemGuest 332 天前 |
51 shanai 332 天前 搜索下 CJSON 、HPACK |
![]() | 52 junwind 332 天前 自己定义一套字典呗, 比如 a 表示 xxx ,b 表示 yyy ,然后把这套字典交给要解析的对方。 |
53 ink19 332 天前 @systemGuest #50 如果你返回的 id ,那为啥还需要保存 md5 呢?我比较同意 JShen 的说法,如果你要使用一个 key ,最好就是用散列的 key ,可以防爬,比如 b 站的 bv 号。 |
54 JShen 332 天前 @systemGuest #50 这里很多不明确的需求,数据量有多大?后续 json 会不会变?你直接一个 md5 我没看懂,md5 数据相当于没办法恢复了,返回 ID 的做法不太符合互联网的常规做法,美团的订单号不是顺序的,淘宝也不是,就是防止在订单上被人爬取。这些都是要考虑的。 |