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