短链接实现
2016-04-07 13:49
459 查看
短连接能够在限制发布内容的平台上节省url内容的长度而有用武之地,在排除域名的短之外,一个快速可靠的短连接生成算法就是短连接服务的核心。
原理
给每一个请求短地址的长地址分配一个数字ID,该ID每次请求自增。这个自增可以很容易实现,数据库的自增ID或者是序列即可满足要求。由于数字ID是10进制的,表现成文本会比较冗长,所以可以将十进制数字转成62(26大写+26小写+10数字)进制文本。举例算法
/// <summary> /// 数字ID与字符串相互转换算法 /// </summary> public class DigitMapAlgo { public DigitMapAlgo(char[] keyMap) { KeyMap = keyMap; KeyIndex = new Dictionary<char, int>(); for (var i = 0; i < keyMap.Length; i++) { KeyIndex[keyMap[i]] = i; } } protected char[] KeyMap { get; set; } protected Dictionary<char, int> KeyIndex { get; set; } public string Trans(long id) { StringBuilder sb = new StringBuilder(); var newId = ReverseLong(id); while (newId > 0) { sb.Append(KeyMap[newId % KeyMap.Length]); newId = newId / KeyMap.Length; } return sb.ToString(); } public long Resume(string key) { long id = 0; for (var i = 0; i < key.Length; i++) { id += KeyIndex[key[i]] * Pow(KeyMap.Length, i); } id = ReverseLong(id); return id; } private long ReverseLong(long v) { var cs = new List<char>(); cs.Add(v.ToString()[0]); cs.AddRange(v.ToString().Skip(1).Reverse()); return long.Parse(string.Join("", cs)); } private long Pow(long a, int n) { long s = 1; while (n-- > 0) { s *= a; } return s; } }
相关文章推荐
- Android事件传递机制
- HDU 2149 Public Sale 巴什博奕
- magent + memcached 集群测试
- CAS实现单点登录(SSO)经典完整教程
- SGI特殊的空间配置器 std::alloc
- 唯一分解定理
- “模拟退火算法的并行化”之“工欲善其事,必先利其器”
- Irrlicht纹理部分
- Activity和fragment的简单切换效果
- Android最牛的开源整理
- python,os操作文件,文件路径功能操作方法及函数
- 一台电脑多个git使用 push 时候出现denied
- 分布式事务入门-Spring+JTA+Atomikos+Hibernate+JMS
- Irrlicht之材质部分
- 【Android 基础】AsynTask 异步任务
- gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf 和glibc-2.14的安装与问题解析
- 5.3.1.3 参数smtpd_delay_reject:延迟出错响应
- poj 2411 (状态压缩dp)
- SCCM2012软件应用程序发布
- STL六大组件