这里采用10进制转62进制的方式,可以实现URL长度的进一步压缩。
>在main函数部分的代码中,v1版本代码是不压缩的,v2是压缩后的。分别运行下,可以看出url长度上的变化。
// 10进制转为62进制
func conv62(num int64) string {
chars := []rune("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")
var result []rune
for num > 0 {
remainder := num % 62
result = append([]rune{chars[remainder]}, result...)
num /= 62
}
return string(result)
}
// 62进制转为10进制
func conv10(str string) int64 {
chars := []rune("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")
var result int64
for i := 0; i < len(str); i++ {
result += int64(strings.IndexRune(string(chars), rune(str[i]))) * (int64(math.Pow(float64(len(chars)), float64(len(str)-i-1))))
}
return result
}
**1、六十二进制表示法**
前面提到的快递单号和短信链接就引出了今天要说的短网址和短ID,顾名思义短网址就是非常短的网址,比如http://t.cn/EXyAO7T,其中核心的部分EXyAO7T只有7位长度。
其实这里的7位长度是使用 62 进制来表示的,就是常用的 0-9、a-z、A-Z,也就是 10 个数字 + 26 个小写 + 26 个大写 = 62 位。
那么7位长度62进制可以表示多大范围呢?
62^7 = 3,521,614,606,208(合计3.5万亿),这样的话只要算法得当,短网址冲突的概率就很低了。
至于短网址的长度可以根据自己需要来调整,即使6位长度62^6也能达到568亿的范围,所以回答了上面快递单号的问题。
如果有弱加密需求,不想让人明确知道转换前是什么,使用方可以按照自己的需求来调整62进制各位代表的含义,比如A站点将字母c表示32、B站点将字母c表示60,就相当于密码本了。
**2、更大进制表示法**
看到这里你或许会说,使用108进制(如果有的话)岂不是网址更短,是的,但是108个进制就可能会出现大量的不常用字符 比如 # % & \* 这些,通用性和记忆性就变差了,62进制是个权衡折中,已经足够无需过设计。
#### **关于跳链**
当打开淘宝的短网址时页面出现了跳转,出现了新的页面,浏览器显示的新网址并不是你打开的短网址了,也就是发生了301/302跳转。
http中返回码301是永久重定向,也就是短网址和长网址是一一对应的,http返回码302表示是临时重定向,也就是可能过段时间短网址就失效了。
由于数据统计和活动临时性等特性,302短网址应用更多,但是302临时短网址对于主站点的SEO有一定的影响,过分使用也会降低站点排名。
所以短网址在平时站点搞活动或者分享页时应用比较多,微博、淘宝、微信基本上都是短网址。
#### **短连接的安全性**
虽然短链接便于传输和记忆,但是位数少并且无明确站点信息,容易出现猜测攻击和钓鱼攻击,比如一些黑基站发送短信,如果是短链接点开可能就跳转到非可信任网址,因此不建议使用短链接发送传输核心敏感数据,即使传输也要做好权限鉴别,加强安全处理,软件工程没有银弹,还是要辩证看待。