有没有免费的短网址工具?


我是@程序员小助手 。本文从技术角度 。对短网址进行深度挖掘 。
前言
网上已经有产品 。用着还不错 。可是 。作为程序员 。从零开始造轮子 。开发一个属于自己的短网址服务器 。这想法amazing!
通过本文 。读者可明白短网址的技术原理 。以及通过Go语言实现一个短网址服务 。

有没有免费的短网址工具?

文章插图
简明教程
短网址为什么存在?
微博等产品的兴起 。活跃了网上的社交圈内大多数用户 。但是微博一般有140字限制 。如果不转发 。单纯评论文字 。再加上一段网址 。极有可能超过限制而被截断 。
短网址应运而生 。用较短的一个字符串 。替换较长的一个字符串 。从观感上讲 。效果要友好的多 。
从技术原理上说 。短网址是一个hash表 。用于映射两个字符串的对应关系 。
有没有免费的短网址工具?

文章插图
使用键 。找到对应的值 。重定向进行访问 。就完成了整个流程 。
短网址算法
短网址的一般结构 。比如新浪的 SwuTjn 。其中后端的一段6位字符串 。就是用来唯一标记一条记录的ID 。那么 。使用什么算法 。可以生成一条无重复的ID呢?
使用通用的做法 。使用 0-9 A-Z a-z 一共62个字符 。我们看使用hash键位数分别有多少种排列组合情况 。
1位:pow(62,1) = 62 种
2位:pow(62,2) = 3844 种
3位:pow(62,3) = 238328 种
4位:pow(62,4) = 14776336 种
5位:pow(62,5) = 916132832 种
6位:pow(62,6) = 56800235584 种
一般情况下 。6个字符 。就足够使用了 。共计568亿种可能 。
还有一种情况是 。用原网址字符串的MD5值 。共计32位 。然后通过切分为4段 。分别按位与运算 。并裁剪到30位 。间隔5位选出该位的字符作为该段索引 。共有6位 。但是这种做法也有几率发生重复 。也不直观 。
因此本文使用第一种算法生成键ID 。
工具准备
分析短网址的特性 。包含以下项目:
唯一性:键需要全局唯一
时效性:键需要有过期时间
目标网址唯一 。如果重复 。则自动返回既有的键 。
考虑到上述情形 。我们使用redis存储这些对应关系 。使用Gin框架作为路由和控制器 。提供对外的API访问 。
核心函数
计算机中常见的2进制 。8进制 。10进制 。16进制 。我们此处需要使用62个字符 。循环表示一个整数 。那么可称之为62进制 。
下面使用go语言实现这个函数 。用于将任意的整数(uint64)转换为(0-9A-Za-z)的字符串 。
有没有免费的短网址工具?

文章插图
需要注意 。基础的方法 。就是循环取余数 。根据进制字典 。索引相应的字符 。然后将各个余数拼接出来 。就是结果 。
这个计算方法 。与2进制 。8进制 。原理是相同的 。
由于字典比较长 。有62个键值对 。我们仅列出一部分 。
有没有免费的短网址工具?

文章插图
上述函数的转换结果 。类似于 6489264001 = 75ai0p
功能规划
下面是对于系统路由 。创建短链接 。以及使用短链接访问目标网址的方法 。
1 - 规划路由
路由比较简单 。一共2个 。一个POST方法 。生成短链接;一个是GET方法 。访问短链接 。
代码如下:
有没有免费的短网址工具?

文章插图
2 - 引入redis并初始化
为了方便演示 。我们使用redis存储键值 。并设置expire时间 。
\"github.com/gin-gonic/gin\"\"github.com/go-redis/redis/v7\"
我们使用go-redis提供的接口操作redis数据库 。
下面是全局的
redis.Client
对象生成 。和初始化函数 。
有没有免费的短网址工具?

文章插图
这样做的好处是 。我们全局都可以使用变量 rdb 调用方法操作redis键值 。
3 - 实现POST路由方法:add
本函数用于接收form表单数据 。生成一个全局唯一的 hash。作为键 。存入redis 。设置值和过期时间 。
代码如下:
有没有免费的短网址工具?

文章插图
本段我们使用了一个 getCounter 函数 。这是设置在redis内的键 。将其每次请求创建的时候 。自增+1 。可保证无重复 。根据这个计数器 。我们调用 helper的 DecToAny 方法 。将其转化为62进制的字符串 。作为全局唯一的 hash 值 。
下图是 getCounter 的定义:

推荐阅读