短链接实现

短连接能够在限制发布内容的平台上节省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;
        }
    }
posted @ 2016-04-07 13:49  binking338  阅读(555)  评论(0编辑  收藏  举报