TinyURL的实现原理
来源:互联网 发布:梦想网络 编辑:程序博客网 时间:2024/06/10 12:25
TinyURL[http://tinyurl.com]是一个在线web服务。它能将你任意输入的url简化一个由http://tinyurl.com/
和一个随机字符串组成短url.访问短url会经过http://tinyurl.com服务跳转至长url.
比如,http://blog.csdn.net/bdss58
经过短化后,生产http://tinyurl.com/y9abtgrp
。在浏览器输入http://tinyurl.com/y9abtgrp,会自动跳转http://blog.csdn.net/bdss58。
随机字符串由大小写字母和数字组成
"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做跳转。
阅读全文
0 0
- TinyURL的实现原理
- 一个获取tinyUrl的类
- QQ过滤tinyurl.com的链接
- 使用PHP调用TinyURL API的方法
- TinyURL设计方案
- WM_COPYDATA的实现原理
- JBPM的实现原理
- XIo的实现原理
- 搜索引擎的实现原理
- 搜索引擎的实现原理
- udev的实现原理
- udev的实现原理
- Random的实现原理
- 飞鸽传书的实现原理
- 实现RSS的原理
- sleep()的实现原理
- udev的实现原理
- RTLinux的实现原理
- This is probably because there is no OLE editor registered against the type
- 【c#】c#中 字符串的基本操作
- 《How to Get Control of Your Time and Your Life》
- struts2工作原理
- 如何去掉论坛后缀 “power by discuz!
- TinyURL的实现原理
- Unity第一人称控制器脚本解析-FPSCharacterController( FirstPersonController)
- Java-DateUtils工具类
- easyUI中出现的小的修改
- 小米趣闻
- CodeForces 822B Crossword solving
- Android Toast基础与原理
- 楼宇中开放系统的LonWorks解决方案
- 字符串——拼接最小字典