Written with StackEdit.

背景

前些天,和同学交流,他说要做一个生成短链的系统,然后我们就针对这个进行了研究和讨论

讨论方案

  1. 我们首先讨论了下该系统的功能模块,既然是要把长链转成短链,必然需要一个生成短链的接口;既然生成了短链,那我们必然需要有短链转长链的功能。所有确定了系统提供的功能:

    a. 由长链生成短链
    b. 由短链还原长链

  2. 确定了功能,就开始设计方案,这里面就面临这两个问题,第一个问题,如何进行短链生成?第二个问题,如何还原出原有的长链?

    a. 我们首先想到的是有没有一种算法可以实现长字符串转成短字符串,又可以把短字符串还原回去?简单思考了下这个其实不太现实,加密更多的是把字符串变的更长或者同长度的转换,这样才可以正常的解密回来。
    b. 那我们需要一种算法把长字符串转成断字符串,然后落地下短链和长链的映射关系,这样也可以做到还原原有长链的功能,这也是我们最终确定的方案

  3. 确定了设计方案,我们如何设计长链变短链的算法?

    a. 这里有一个问题,就是不同的链接不能变成相同的短链,也就是说我们需要针对短链进行去重。
    b. 我们的短链要固定长度,也就是说无论多长的字符串,都要生成相同长度的字符串,首先想到的是随机数,只要长度足够,我们就可以随机出概率足够小的随机字符串来,再加上去重的方案,就可以保证唯一的短链生成。
    c. 然后我们想到了hash,根据字符串的hash码再做映射出固定长度的字符串来,这样做相对随机数碰撞概率更小,重复生成的几率也就更少
    d. 我们觉得这两种方案都是可行的,但是却总有些差强人意,有没有更好的方式去做?然后查询资料,发现了使用md5值的方案进行转换,具体如下:

0.确定短链为6位,每位由0-9a-zA-Z共62个字符组成,这样六位码可以组成580亿个组合。1.首先通过原始链接进行MD5得到一个32位的0-9a-f的字符串。2.把字符串按照1-6,6-11,11-16,16-21,21-26,26-31分成六份,每份六个字符3.把每份的六位当成十六进制,计算得到一个long值,然后除以62得到余数,通过余数找到62个字符中的一个。4.把六份字符串计算得到的字符组合后就是最终六位短码。
  1. 分析使用md5方式的好处与问题:

a. 固定长度的随机字符串生成
b. 碰撞几率更小
c. 这个没法解决重复的问题,还是有概率出现重复

思考

有没有其他一些方法?

关于长链转短链的方案和思考相关推荐

  1. Java 实现长链转短链 与 生成二维码

    最近有个分享的需求,将分享的长链接转化为短链接,并生成二维码,便于扫码分享. 本方案采用建立长链和短链的对应关系,即生成短链后存放数据库,使用的时候读取的方式,记录下来,方便备查. 1.生成短链 转换 ...

  2. 长链和短链的区别(转载)

    首先介绍下短链接和长连接的区别: 短连接 连接->传输数据->关闭连接 比如HTTP是无状态的的短链接,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接. 具体就 ...

  3. 短链有啥好处,用长链不香吗

    原文链接 前言 今天,我们来谈谈如何设计一个高性能短链系统,短链系统设计看起来很简单,但每个点都能展开很多知识点,也是在面试中非常适合考察侯选人的一道设计题,本文将会结合我们生产上稳定运行两年之久的高 ...

  4. python网址太长_Python GUI-长链转短链

    当我们想要与某人分享链接或将链接放入帖子时,如果链接太长,则会占用大量空间,而且非常缺乏吸引力.在这个时候,我们可以结束长链到短链的转换工具.当然,您可以直接搜索在线网站进行转换,但我们可以使用它来练 ...

  5. 树链剖分之长链剖分 详解 题目整理

    树链剖分 题目中出现的树链剖分一般分为两种,重链剖分和长链剖分 重链剖分:选择子树最大的儿子, 将其归入当前点所在 的同一条重链 长链剖分:选择向下能达到的深 度最深的儿子,将其归 入当前点所在的同一 ...

  6. 有向图的强联通分量之:【求最长链】【求最长链的方案数(图论中的方案数DP)】【最长链和最大半联通子图 节点数相同】【最长链与最大半联通子图等价又不完全等价】

    注意了: 最长链与最大半联通子图是等价又不完全等价的. 最大半联通子图的节点数 会 与最长链的节点数相同, 但是边数的话,最大半联通子图还是会加进 两个点之间的所有边 但是本题的主要目的是求 最长链上 ...

  7. 微博开放平台接口整理系列--短链转长链

    前言: 因为工作原因,开始开辟一个新的分类:微博开放接口探究系列,目的是把自己日常使用的一些东东记录下来. 正文: 本文主要是"短链转长链"的接口. 请求地址: http://ap ...

  8. 浅谈几种区块链网络攻击以及防御方案之其它网络攻击

    旧博文,搬到 csdn 原文:http://rebootcat.com/2020/04/16/network_attack_of_blockchain_other_attack/ 写在前面的话 自比特 ...

  9. 浅谈几种区块链网络攻击以及防御方案之拒绝服务攻击

    旧博文,搬到 csdn 原文:http://rebootcat.com/2020/04/14/network_attack_of_blockchain_ddos_attack/ 写在前面的话 自比特币 ...

最新文章

  1. python使用fpdf2包和pdfrw包在已有的PDF页面上添加新的页
  2. swing 聊天气泡背景_Java Swing中的聊天气泡
  3. java restful文件传输_java中使用restful web service来传输文件
  4. 领导者的资质——学习笔记(1)
  5. Java 8 Stream API详解
  6. OPPO Reno 2正式发布:主打4800万变焦四摄 售价2999元
  7. php JS 导出表格特殊处理
  8. 埃尔米特(Hermite)插值及其MATLAB程序
  9. JAVA虚拟机规范第八版与JAVA虚拟机规范第九版PDF资源分享
  10. 数学建模论文写作方法大总结
  11. python知识图谱构建
  12. 普加计划甘特图功能介绍
  13. Web应用防火墙(WAF:Web Application Firewall)简介
  14. UnicodeDecodeError: ‘utf-8‘ codec can‘t decode bytes in position 5098-5099: invalid continuatio byte
  15. PC时代的20位英雄
  16. SpringBoot 实现Excel文件解析
  17. SpringCloud(H版alibaba)之基本框架篇
  18. 多视图几何的数学基础知识的掌握(2)--李群李代数
  19. 多源异构航班航迹数据流实时融合方法研究
  20. 基于JAVA企业进销管理系统的设计与实现计算机毕业设计源码+数据库+lw文档+系统+部署

热门文章

  1. MIPS RAM实验设计
  2. 计算机财务管理教学视频教学,财务管理专业计算机公共课教学方法的探讨
  3. IT人物之《Netty权威指南》中文作者 专访华为李林锋:我与Netty那些不得不说的事
  4. Linux集群管理软件clustershell
  5. Oracle数据库客户端各个版本下载
  6. 设置wifi5G热点后重启后变成2.4G分析过程
  7. COMSOL中的动网格
  8. 粒子群算法原理|python实现|参数调优
  9. Apache Spark+PyTorch 案例实战
  10. 没有工业软件 谈什么智能制造转型