
TinyURL的实现原理
发布日期:2021-05-08 04:53:28
浏览次数:19
分类:精选文章
本文共 2603 字,大约阅读时间需要 8 分钟。
TinyURL[是一个在线web服务。它能将你任意输入的url简化一个由http://tinyurl.com/
和一个随机字符串组成短url.访问短url会经过服务跳转至长url.
http://blog.csdn.net/bdss58
经过短化后,生产http://tinyurl.com/y9abtgrp
。在浏览器输入,会自动跳转。 随机字符串由大小写字母和数字组成
"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
tinyurl 是如何 完成http://tinyurl.com/y9abtgrp
到 http://blog.csdn.net/bdss58
跳转的呢?
1. url入库
将http://blog.csdn.net/bdss58
出入数据库,得到一个唯一的自增id.
2. 唯一自增id 映射 到随机字符串
可以通过已定的hash算法将自增id转化为随机字符串,然后存入id对应数据库记录中
id url tinyurl89823 `http://blog.csdn.net/bdss58` `http://tinyurl.com/y9abtgrp`
具体的hash算法可以是下面实现:
// convert a number to a base62 stringfunc convNumToBase62(num int) string { // base62 charactors chars := []string{ "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", } var digitals []int for num != 0 { digitals = append(digitals, num%62) num = num / 62 } reverse := func(arr []int) []int { for i, j := 0, len(arr)-1; i < j; i, j = i+1, j-1 { arr[i], arr[j] = arr[j], arr[i] } return arr } digitals = reverse(digitals) var resultarr []string for _, elem := range digitals { resultarr = append(resultarr, chars[elem]) } return strings.Join(resultarr, "")}
3. 接收请求
tinyurl系统接收到 http://tinyurl.com/y9abtgrp
的请求后,拿到随机字符y9abtgrp
,推到出对应数据库记录的自增id,然后根据id查询数据库。
随机字符推到自增id的方法可以是如下:
func base62ToNum(str string) float64 { chars := []string{ "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", } table := make(map[string]int) for i, e := range chars { table[e] = i } var result float64 l := len(str) for i, e := range str { result = result + float64(table[string(e)])*math.Pow(62, float64(l-i-1)) } return result}
4. 跳转
经过步骤3,拿到数据库的自增id ,根据id拿出相应记录的url字段,根据url做跳转。
发表评论
最新留言
关注你微信了!
[***.104.42.241]2025年03月30日 21时16分39秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
深入学习C++
2021-05-08
【HTTP】HTTP状态码图解
2021-05-08
《图解TCP/IP》学习——第六章TCP与UDP
2021-05-08
双系统基础上装三系统教程
2021-05-08
Android低级错误踩坑之Application
2021-05-08
android自定义无边框无标题的DialogFragment替代dialog
2021-05-08
获取android的所有挂载路径(转)
2021-05-08
记录一下写的一个java生成不带重复数的随机数组(算法没有详细设计,只实现功能)
2021-05-08
androidstudio同步的时候下载jcenter的库出错解决办法
2021-05-08
ButterKnife使用问题
2021-05-08
React学习笔记(一)
2021-05-08
低代码平台快速开发小程序
2021-05-08
vue学习笔记
2021-05-08
低代码后续发展路线图
2021-05-08
MobX 学习 - 04 TodoList 案例
2021-05-08
MobX 学习 - 06 异步任务、rootStore、数据监测
2021-05-08
react: antd 中 table 排序问题
2021-05-08
FPGA学习网站推荐
2021-05-08
LeetCode:100. Same Tree相同的树(C语言)
2021-05-08