本文主要介绍了C# url的短URL压缩算法和短URL的原理分析。本文重点介绍算法代码,有需要的朋友可以参考一下。
短网址的应用已经在全国各地的微博中流行起来。比如QQ微博的url.cn,新郎的sinaurl.cn等等
当我们在QQ微博上发布网址时,微博会自动识别网址并转换,例如http://url.cn/2hytQx
为什么要这么做?我认为有几个原因:
微博的字数限制是140字,所以如果我们需要发一些链接,但是这个链接太长了,会占用我们将近一半的内容,这是肯定不允许的,于是短网址就应运而生了。
短URL可以用来管理我们项目中的开放URL。有些网址可以涵盖暴力、广告等信息,这样我们完全可以通过用户的举报来管理这种联系。这个连接不会出现在我们的应用程序中,因为相同的URL在加密后会得到相同的地址。
我们可以对一系列网站的流量和点击量进行统计,挖掘出大部分用户的关注点,有助于我们对项目的后续工作做出更好的决策。
其实以上三点纯属个人观点,因为会在我下一部分的项目中应用,所以了解一下。先来看看短URL映射算法的理论(网上找的资料):
从长网址md5生成一个32位签名串,分成4段,每段8字节;
对于四段循环处理,取8个字节,作为十六进制字符串与0x3ffffffff (30位1)的and运算处理,即忽略30位以上的处理;
将30位分成6段,每段5位数作为字母表的索引,得到特定字符,依次得到6位字符串;
总共md5个字符串可以得到4个6位字符串;取其中任意一个作为这个长url的短url地址;
很简单的理论,我们不一定说得到的URL是唯一的,但是我们可以拿出四组URL,这样几乎没有太多重复。
让我们来看看程序部分:
复制代码如下:
公共静态字符串[] ShortUrl(字符串Url)
{
//您可以在传输MD5加密字符之前自定义混合密钥。
string key=" Leejor
//要使用的生成的URL的字符
string [] chars=新字符串[]{
“a”、“b”、“c”、“d”、“e”、“f”、“g”、“h”,
“我”,“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”、“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”
};
//用MD5加密传入的URL
字符串十六进制=系统。web . security . forms authentication . hashpasswordforstoringconfigfile(密钥url,“MD5 ”);
string [] resUrl=新字符串[4];
for(int I=0;I 4;我)
{
//加密的字符与8位十六进制的0x3FFFFFFF进行逐位AND运算。
int hexint=0x3FFFFFFF Convert。ToInt32( "0x "十六进制。Substring(i * 8,8),16);
字符串outChars=字符串。空的;
for(int j=0;j 6;j)
{
//将得到的值与0x0000003D进行按位and运算,得到字符数组的chars索引。
int index=0x0000003D hexint
//添加获取的字符。
out chars=chars[index];
//每周期右移5位。
hex int=hex int 5;
}
//将字符串存储到相应索引的输出数组中
resUrl[I]=out chars;
}
返回resUrl
}
现在可以直接使用这个方法,可以等到下面四组值:
复制代码如下:
short URL(https://www . jb51 . net)[0];//获取值fAVfui
short URL(https://www . jb51 . net)[1];//获取值3ayQry
short URL(https://www . jb51 . net)[2];//获取值UZzyUr
short URL(https://www . jb51 . net)[3];//获取36rQZn的值
在存储这个URL的数据方面,我个人推荐TTServer。有些朋友可能没听说过。下面是这个数据库的介绍:
东京柜是日本人Mikio hira bayashi(PingMotoo Hayashi)开发的DBM数据库(注:著名的DBM数据库qdbm就是他开发的)。数据库的读写速度非常快。插入:0.4秒/1,000,000条记录(2,500,000 QPS),写入100万条数据只需要0.4秒。搜索:0.33秒/1,000,000条记录(3,000,000 QPS)。读取100万条数据只需要0.33秒。
可以看到字典类型数据键/值的查询。这个数据库可以说是我目前看到的效率非常高的。此外,它非常小,非常适合配对短url/长URL。
系统使用6个短代码字符来表示任意长度的URL。的有效字符代码是ASCII' A '到' Z '和' 0' 5 ',其中每个字符包含2 ^ 5(32)个状态。6的短码字符可以用来绘制32 ^ 6的URL(1073741824)
首先,您需要一个数据库表来存储和检索映射的URL。
复制代码如下:
创建表mappedURL(创建表mappedURL的(
短码字符(6)不为空,
lognURL文本不为空,
主键shortCodeInd(短码),
);
其次,你需要定义一个算法将长URL映射到短URL。上面已经介绍了算法。
第三,你需要创建一个网页,从数据库短URL的映射中找到原URL,重定向。
———————————————————
MD5已经被破解,所以不排除攻击者可能伪造同一个MD5的url来达到恶意目的。如果不考虑这种情况,md5碰撞的可能性应该极低,估计你我有生之年都见不到了。
另外,不知道“同一个URL每次计算的键值必须相同”的实际目的会是什么。即使同一个URL对应不同的键值,一般也不会造成太大的浪费吧?只有6位数的字母数字组合才能容纳数十亿种变体。
我问这个问题是因为担心md5碰撞。相同的URL应该对应相同的键值,因为每个URL地址需要唯一地对应数据库中的一个表数据,但是直接用URL查询会比较慢,因为:
要存储的URL和相关记录数据量非常大。
有些网址会很长,所以使用文本字段。
但是如果散列后的唯一键值存储在varchar中,根据这个键值进行查询会非常方便快捷。
就像git中的对象哈希一样,目前基本不需要考虑冲突。
bit.ly等url较短的服务是如何实现的?
不需要从哈希键值反向查找url?如果有这样的要求,url必须存储在一个地方,以便在冲突的情况下可以散列。
MD5是一个128位的散列码(4个整数,每个整数有4个字节)。所以一个url的MD5码有两种可能的128次方(也就是2e128)。随机找到的两个URL的MD5码相等的概率是2e128中的一个,即R=2E128。
如果在MD5之后将url插入数据库,第一个url将不会重复。插入第二个MD5时,其与第一个重复的概率为r,插入第三个url时,重复概率为2r,以此类推,插入第N个URL时的重复概率为(n-1 ) r. N个MD5代码,其中两次重复的概率为这些概率之和。(1+2+3+……(n-1))r=(1/2)n(n-1)r
对于n个MD5码的集合,重复概率为(1/2)*(n/2e64)e2。
所以,只有当N大到可以和2e64媲美的时候,才需要考虑它的冲突性。而且2的64次方还是很大的。
所以,只要不是恶意攻击,一般应用不太可能有碰撞。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。