,,C# URL短地址压缩算法及短网址原理解析

,,C# URL短地址压缩算法及短网址原理解析

本文主要介绍了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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • 设计一个简单的C#控制台应用程序,C#控制台程序,C# 创建控制台应用程序
  • 深入解析windows第8版,深入解析C#(第4版)
  • 数组代码,c# 数组操作,C# 数组实例介绍(图文)
  • 学会C#要多久,学会c#要多久,c#学习之30分钟学会XAML
  • 回溯法01背包问题c,回溯法求解01背包问题伪代码,C#使用回溯法解决背包问题实例分析
  • xml文件转义字符,xml转意字符,C# XML中的转义字符操作
  • winform 进度条控件,c# 进度条使用
  • winform 进度条控件,c# 进度条使用,C#使用winform实现进度条效果
  • winform backgroundworker,c# isbackground
  • winform backgroundworker,c# isbackground,C# BackgroundWorker用法详解
  • lua与c#交互,lua c#
  • lua与c#交互,lua c#,ToLua框架下C#与Lua代码的互调操作
  • linq c#,linq原理 c#
  • linq c#,linq原理 c#,c#中LINQ的基本用法实例
  • java decimal保留两位小数,sql中decimal函数保留2位小数,C#中decimal保留2位有效小数的实现方法
  • 留言与评论(共有 条评论)
       
    验证码: