c# 网址压缩简单实现短网址
发布时间:2022-10-06 15:37:17
短网址,忽然一下子就冒出来的东西,长长的一个URL,提交过去,出来就只有短短的一个URL了,看起来似乎挺神奇,其实简单分析一下,明白其中的原理,也是一件很简单的事情。
短网址的名称网上叫的有很多种,网址缩短、网址压缩什么什么的,原理说白了就跟您带了一包东西去超市购物,进超市前把东西塞到超市的储物柜,然后拿到一个号码牌,您进超市就不用再背一大包东西了,只需要拿着一个小小的号码牌,出来时再把号码牌还回去,把您的背包拿出来,是一个道理。
知道原理,我们实现起来就简单了很多,无非就是接收一个URL,然后分配一个号码,当有人读取这个号码时,我们再把对应的URL调出来并重定向,就完事了。
所以表其实很简单,简单到只需要两个字段,一个自增ID,一个URL地址。
这里我就不写出详细的代码了,简单的增删改查这种最基本的操作相信大家应该都会。
那这样我们提交一个URL,得到的URL就类似:http://9520.me/10086
看起来似乎就完成了,其实不然,我们拿到的自增ID是一个10进制的数字,而我们看到的大多数短网址后面的参数肯定不是全数字的,而是带了字母的,毕竟10进制表示的话,数据量上来后还是会显得有点长,那我们就可以把字母也用上吧,大小写字母加数字,相当于是62进制,那我们还需要再实现一个进制转换的方法来对ID进行压缩,进制转换其实也是很简单的东西,明白原理的随手都可以写出来,不明白的随便搜索一下也能写出来,这里我就把我自己的实现列出来吧,如果大家有更好的实现,不妨留言告诉我。
static string Number = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
/// <summary>
/// 压缩ID标识
/// </summary>
/// <param name="n"></param>
/// <returns></returns>
public string Short(long n) {
string result = string.Empty;
int l = Number.Length;
while (n / l >= 1) {
result = Number[(int)(n % l)] + result;
n /= l;
}
result = Number[(int)n] + result;
return result;
}
/// <summary>
/// 还原ID标识
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
public long UnShort(string s) {
long result = 0;
if (s.HasValue()) {
s = s.Trim();
int l = s.Length;
int m = Number.Length;
for (int x = 0; x < l; x++) {
result += Number.IndexOf(s[l - 1 - x]) * (long)Math.Pow(m, x);
}
}
return result;
}
那我们刚才的URL:http://9520.me/10086,经过压缩后就变成了:http://9520.me/2CG,少了两个字母,当然,数字越大时效果越明显。
OK,明白了原理后,相信您自己做一个短网址的网站也不难了吧,难的只是有一个短的域名而已了。
要是觉得对您有帮助不妨点一下推荐吧,有什么想法或建议可以留言一起讨论噢~~~


猜你喜欢
- 数字9 出现的次数编写程序数一下 1到 100 的所有整数中出现多少个数字9源码public static int Getnum
- 在最近的项目中有个需求是这样的:入参封装成JSON,EXAMPLE:{ "uuid": "iamauuid&q
- springcloud整合stream,rabbitmq实现消息驱动功能1.代码实现:创建项目stream添加依赖<parent>
- 先给大家这是下效果图:谷歌提供的v4包,ViewPager在布局文件中,先添加<android.support.v4.view.Vie
- 本文实例为大家分享了C#实现图片切割、切图的具体代码,供大家参考,具体内容如下前台准备两个Image控件。上面是显示原图,下面显示切割后的效
- 最近一个项目中,因为服务端是用的java开发的,客户端是用的C#,由于通信部分采用到了3DES加密,所以做个记录,以备以后需要的时候直接用。
- 菜单控制:可以用来判断这个用户是不是有这些角色,没有的话就不展示数据控制:由于数据都是从后端查的,在后端控制权限就可以了<!-- &n
- 11.可以使用抽象函数重写基类中的虚函数吗? 答: 可以 需使用 new 修饰符显式声明,表示隐藏了基类中该函数的实现
- springboot项目不配置数据源启动报错spring boot默认会加载org.springframework.boot.autocon
- 1、HashMap HashMap继承抽象类AbstractMap,实现接口Map、Cloneable, Serializable接口。Ha
- 1. LongAdder和AtomicLong类似的使用方式,但是性能比AtomicLong更好。LongAdder与AtomicLong都
- 利用之前学过的多线程处理技术,我们做一个开启新线程实现电子广告牌的项目界面布局文件,加入ImageView图片控件,用于显示一个图片,一个T
- 本文实例讲述了Android实现在xml文件中引用自定义View的方法。分享给大家供大家参考,具体如下:在xml中引用自定义view方法一:
- 其实写到这里,我已经差不多断气了。。。常规套路,这里是前三篇的传送门,需要的同学可以看一下:JAVA写文本编辑器(三) JAVA写文本编辑器
- 每当想找哪个运算符优先级高时,很多时候总是想找的就没有,真让人气愤!现在,终于有个我个人觉得非常全的,分享给大家,欢迎拍砖!C语言运算符优先
- 本文实例讲述了Android编程设计模式之抽象工厂模式。分享给大家供大家参考,具体如下:一、介绍抽象工厂模式(Abstract Factor
- Maven打包时指定启动类使用Maven打包的时候, 有时候需要指定启动类, 可如下操作!测试项目(结构如下):代码: com.xxx.Ma
- Android USB转串口通信开发实例详解好久没有写文章了,年前公司新开了一个项目,是和usb转串口通信相关的,需求是用安卓平
- mybatis-plus Condition拼接Sql语句各方法1.setSqlSelect—用于添加查询的列信息public Wrappe
- 本文实现初次设置密码验证过程,首先实现如下效果布局如下:<?xml version="1.0" encoding=