短网址ShortUrl的算法
场景:
我们在新浪微博上公布网址的时候。微博会自己主动判别网址。并将其转换。比如:http://t.cn/hrYnr0。
为什么要这样做的,原因我想有这样几点:
1、微博限制字数为140字一条,那么假设我们须要发一些连接上去,可是这个连接很的长。以至于将近要占用我们内容的一半篇幅。这肯定是不能被同意的。所以短网址应运而生了。
2、短网址能够在我们项目里能够非常好的对开放级URL进行管理。
有一部分网址能够会涵盖性、暴力、广告等信息。这样我们能够通过用户的举报,全然管理这个连接将不出如今我们的应用中,应为相同的URL通过加密算法之后,得到的地址是一样的。
3、我们能够对一系列的网址进行流量,点击等统计,挖掘出大多数用户的关注点。这样有利于我们对项目的兴许工作更好的作出决策。
以下先来看看短网址映射算法的理论(网上找到的资料):
① 将长网址用md5算法生成32位签名串,分为4段,,每段8个字符;
② 对这4段循环处理,取每段的8个字符, 将他看成16进制字符串与0x3fffffff(30位1)的位与操作。超过30位的忽略处理。
③ 将每段得到的这30位又分成6段,每5位的数字作为字母表的索引取得特定字符,依次进行获得6位字符串;
④ 这样一个md5字符串能够获得4个6位串。取里面的随意一个就可作为这个长url的短url地址。
非常easy的理论,我们并不一定说得到的URL是唯一的。可是我们可以取出4组URL,这样差点儿不会出现太大的反复。
三、 跳转原理
当我们生成短链接之后。仅仅须要在表中(数据库或者NoSql )存储原始链接与短链接的映射关系就可以。当我们訪问短链接时,仅仅须要从映射关系中找到原始链接。就可以跳转到原始链接。
- import util.Encript;
- public class ShortUrl {
- public static void main(String[] args) {
- String url = "http://www.sunchis.com";
- for (String string : ShortText(url)) {
- print(string);
- }
- }
- public static String[] ShortText(String string){
- String key = "XuLiang"; //自己定义生成MD5加密字符串前的混合KEY
- String[] chars = new String[]{ //要使用生成URL的字符
- "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","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"
- };
- String hex = Encript.md5(key + string);
- int hexLen = hex.length();
- ;
- ];
- ; i < subHexLen; i++) {
- String outChars = "";
- ;
- , j * 8);
- ) & Long.valueOf(subHex, 16);
- ; k < 6; k++) {
- ) & idx);
- outChars += chars[index];
- ;
- }
- ShortStr[i] = outChars;
- }
- return ShortStr;
- }
- private static void print(Object messagr){
- System.out.println(messagr);
- }
- }
- public class Encript {
- //十六进制下数字到字符的映射数组
- private final static String[] hexDigits = {"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"};
- /**把inputString加密*/
- public static String md5(String inputStr){
- return encodeByMD5(inputStr);
- }
- /**
- * 验证输入的password是否正确
- * @param password 真正的password(加密后的真password)
- * @param inputString 输入的字符串
- * @return 验证结果,boolean类型
- */
- public static boolean authenticatePassword(String password,String inputString){
- if(password.equals(encodeByMD5(inputString))){
- return true;
- }else{
- return false;
- }
- }
- /**对字符串进行MD5编码*/
- private static String encodeByMD5(String originString){
- if (originString!=null) {
- try {
- //创建具有指定算法名称的信息摘要
- MessageDigest md5 = MessageDigest.getInstance("MD5");
- //使用指定的字节数组对摘要进行最后更新,然后完毕摘要计算
- byte[] results = md5.digest(originString.getBytes());
- //将得到的字节数组变成字符串返回
- String result = byteArrayToHexString(results);
- return result;
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- return null;
- }
- /**
- * 轮换字节数组为十六进制字符串
- * @param b 字节数组
- * @return 十六进制字符串
- */
- private static String byteArrayToHexString(byte[] b){
- StringBuffer resultSb = new StringBuffer();
- ;i<b.length;i++){
- resultSb.append(byteToHexString(b[i]));
- }
- return resultSb.toString();
- }
- //将一个字节转化成十六进制形式的字符串
- private static String byteToHexString(byte b){
- int n = b;
- )
- +n;
- ;
- ;
- return hexDigits[d1] + hexDigits[d2];
- }
- }
短网址ShortUrl的算法的更多相关文章
- Java Net版短网址(ShortUrl)的算法及实现 待续
算法 1)将长网址md5生成32位签名串,分为4段, 每段8个字节; 2)对这四段循环处理, 取8个字节, 将他看成16进制串与0x3fffffff(30位1)与操作, 即超过30位的忽略处理; 3) ...
- URL短网址系统的算法设计及实践
在通常情况下,URL是由系统生成的,通常包括URI路径,多个查询参数,可以对参数进行加密和解密.当人们要分享某个URL,比如短信,邮件,社交媒体,这就需要短URL. 而短网址,顾名思义就是在长度上比较 ...
- 用PHP实现URL转换短网址的算法示例
短网址就是把一个长的地址转换在超级短的网址,然后访问短网址即可跳转到长网址了,下面来看用PHP实现URL转换短网址的算法与例子. 短网址(Short URL) ,顾名思义就是在形式上比较短的网址.在W ...
- 如何做系列(4)-微博URL短网址生成算法原理(java版、php版实现实例)
短网址(Short URL),顾名思义就是在形式上比较短的网址.通常用的是asp或者php转向,在Web 2.0的今天,不得不说,这是一个潮流.目前已经有许多类似服务,借助短网址您可以用简短的网址替代 ...
- C#如何实现url短地址?C#短网址压缩算法与短网址原理入门
c# url短地址压缩算法与短网址原理的例子,详细介绍了短网址的映射算法,将长网址md5生成32位签名串,分为4段,每段8个字节,然后生成短网址,具体见文本实例. 短网址映射算法: 将长网址md5生成 ...
- 长网址 短网址(http://www.zhihu.com/question/19852154?rf=21975802)
短网址(Short URL),顾名思义就是在形式上比较短的网址.通常用的是asp或者php转向,在Web 2.0的今天,不得不说,这是一个潮流.目前已经有许多类似服务,借助短网址您可以用简短的网址替代 ...
- php实现的短网址算法分享
这篇文章主要介绍了php实现的短网址算法,理论上支持1,073,741,824个短网址,个人使用足够了,需要的朋友可以参考下 每个网址用6个字符代替,(6^32) 最多可以拥有1,073,741,82 ...
- php短网址生成算法
<?php //短网址生成算法 class ShortUrl { //字符表 public static $charset = "0123456789ABCDEFGHIJKLMNOPQ ...
- URL短网址生成算法原理和php实现案例
短网址(Short URL),顾名思义就是在形式上比较短的网址. 短链接的好处:1.内容需要:2.用户友好:3.便于管理为什么要这样做的,原因我想有这样几点:微博限制字数为140字一条,那么如果我们需 ...
随机推荐
- Erlang简单并行server
Erlang简单并行服务器 (金庆的专栏) Erlang并行服务器为每一个Tcp连接创建相应的连接进程,处理client数据. 參考 Erlang程序设计(第2版)17.1.3 顺序和并行服务器 并行 ...
- Android资源推荐
Intellj IDEA 安装配置 使用IntelliJ IDEA 13搭建Android集成开发环境(图文教程) Android设计指南站点 图标 App Icon Template免费的Photo ...
- Apache shiro 笔记整理之web整合一
下面内容是在看了涛哥的<跟我一起学shiro> 和 视频<一头扎入进shiro> 后整理出来备忘和方便自己和其它人学习. 个人主页:http://www.itit123.cn/ ...
- 智课雅思词汇---三、aud和auto和bene是什么意思
智课雅思词汇---三.aud和auto和bene是什么意思 一.总结 一句话总结:aud:听 auto:自己,self bene:good,well 1.anthropo是什么意思? anthropo ...
- 55.npm install 报错 :stack Error: Can't find Python executable "python"
转自:https://www.cnblogs.com/zengry/p/8044379.html 解决方法 : 1. 安装python , 设置环境变量 :cmd --> path='%path ...
- es6 ----- export 和 import
ES6 模块不是对象,而是通过export命令显式指定输出的代码,再通过import命令输入. 下面列出几种import和export的基本语法: 第一种方式: 在lib.js文件中, 使用 expo ...
- solr简介
Solr 是什么? Solr它是一种开放源码的.基于 Lucene Java 的搜索服务器,易于加入到 Web 应用程序中. Solr 提供了层面搜索(就是统计).命中醒目显示并且支持多种输出格式(包 ...
- 《Java设计模式》之桥接模式
Bridge模式的概念 Bridge 模式是构造型的设计模式之中的一个.Bridge模式基于类的最小设计原则,通过使用封装,聚合以及继承等行为来让不同的类承担不同的责任.它的主要特点是把抽象(abst ...
- HDU 2563 统计问题 (递推)
A - 统计问题 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Sta ...
- unity3d编程日志
2014/4/27 编写脚本的时候,加入了中文凝视,发现console面板有非常多不可思议的bug.查了一下发现是由于monodevelop脚本中文凝视报错,而英文凝视不会受影响. 解决方法:把凝视放 ...