您的位置:首页 > 其它

短链接实现

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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: