短链接实现
短连接能够在限制发布内容的平台上节省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; } }
作者:binking338
blog:http://www.cnblogs.com/binking338