这里有一个 URL http://elef.top/11918780727494821840.code,其中 11918780727494821840 感觉太长,用什么算法可以把这一堆字符串变得更短,并且还能恢复成原来的字符串
1
likuku 2018-11-23 13:21:16 +08:00
各种开源的短域名产品源代码参考下呗,能用现成的短域名服务,那就直接用吧。
|
2
sxlzll 2018-11-23 13:21:25 +08:00
google 关键词 短链接 算法
|
3
zj9495 2018-11-23 13:21:41 +08:00
http://t.删除 cn/E2Drs42
|
4
idtaanlcoe 2018-11-23 13:22:45 +08:00 via Android
直接转短链接不就好了?
|
5
rayhy 2018-11-23 13:33:45 +08:00
楼主需要的应该是压缩算法而不是短链接那一套吧。
帮楼主试了下 lzma,反而变长了。。 base64.b64encode(lzma.compress(bytes("11918780727494821840",encoding="utf-8"), format=lzma.FORMAT_ALONE, preset=9)) 得到:XQAAAAT//////////wAY4OBiO21o/h1HKGV0+oVxG2+9c8sg21/9bgQA |
6
fyyz 2018-11-23 13:36:29 +08:00 via Android
这个 url 里最后那段只有数字,可以考虑加上大小写字母,把十进制变成 62 进制
|
7
mm163 2018-11-23 13:36:45 +08:00
把数字部分转换成 62 进制或 64 进制,大概可以缩小一半吧。
|
8
largecat 2018-11-23 13:37:12 +08:00 via Android
md5
|
9
hoythan 2018-11-23 13:37:18 +08:00
10 进制转 32 进制
11918780727494821840 => aaq03thd1ji00 |
10
hoythan 2018-11-23 13:38:12 +08:00 4
|
11
fyyz 2018-11-23 13:39:14 +08:00 via Android
还有,最后的 .code 也太长了,如果一定要标识后缀可以压缩成.c
|
12
xy2401 2018-11-23 13:46:54 +08:00
同问。想在 url 里面放 json。压缩一下 分享。有什么比较原生到方法吗? 30%压缩率
|
13
Chappako 2018-11-23 13:50:08 +08:00 1
搜索 hashids
|
15
sutra 2018-11-23 14:23:24 +08:00 1
10 进制换成 64 进制试试:
import java.math.BigInteger; import org.apache.commons.codec.binary.Base64; public class Dec2Base64 { public static void main(String[] args) { BigInteger n = new BigInteger("11918780727494821840"); String s = Base64.encodeBase64URLSafeString(n.toByteArray()); System.out.println(s); System.out.printf("before length: %d, after length: %d\n", n.toString().length(), s.length()); BigInteger n1 = new BigInteger(Base64.decodeBase64(s)); System.out.println(n1); System.out.println(n.equals(n1)); } } AKVoA-xaGcfQ before length: 20, after length: 12 11918780727494821840 true |
16
xi2008wang 2018-11-23 14:23:56 +08:00
用了一下你的服务,发现还可以通过 id 取查,那不是把别人的也查出来了。。。
|
17
daijinming OP @Chappako
$id = $hashids->encode(1191878072,7494821840); var_dump($id); string(15) "WWZmko6C22VRl7K" 短了 5 位 |
18
daijinming OP @xi2008wang 这些信息就是用来共享的,没关系的,短地址当天有效,长地址也就是 11918780727494821840 是根据文件 hash 值生成的,没有规律可循
|
19
daijinming OP @sutra 这个看来是最短了
|
20
webdisk 2018-11-23 14:36:12 +08:00
|
21
BOYPT 2018-11-23 14:39:48 +08:00
想压缩效率最高,就得看这个 id 有没有什么规律,然后根据规律设计算法吧。
我做过个用 mongoid 的记录 id 放 url 的,mongoid 是 24 位 16 进制,有几位固定机器码,然后是时间戳,然后几位随机那样; 机器码固定默认、然后时间戳可以把范围缩小到特定的几年内,最后只记录随机数,最后缩短成 6 位 64 进制好像。时间太久不大记得 |
22
chocotan 2018-11-23 14:41:07 +08:00
hashid+1
|
24
flynaj 2018-11-23 14:45:01 +08:00 via Android
map 一个表保保存,微软就是这样做的
|
26
50vip 2018-11-23 15:31:46 +08:00
100 进制试试看!
|
27
jfcherng 2018-11-23 15:35:15 +08:00
寫了個玩具練手 https://gist.github.com/jfcherng/44fe9183a657758df455da5a575bdaa8
Encoded: W7tuQpX~lnH # of chars saved: 9 |
28
auv1107 2018-11-23 15:52:25 +08:00
存个表
|
29
deadEgg 2018-11-23 16:20:18 +08:00
我以前被面试的时候想了一种短链接的实现方式
可以用 trie 树去实现,简单容易理解,优点多多,缺点就是内存占用大 |