`
blue2048
  • 浏览: 183091 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

短链接

阅读更多

说仿新浪其实算是个嚼头,吸引人们的眼球,对于常规的进制算法可以去参看数据结构一书 
通过取模方式计算出对应的n进制数 

Java代码  收藏代码
  1. int nv = 2//进制  
  2. int n = 4;  
  3. List<Integer> ll = new ArrayList<Integer>();  
  4. while (n >= 1) {  
  5.     ll.add(n%nv);  
  6.     System.out.print(n % nv + ",");  
  7.     n = n / nv;  
  8. }  
  9. System.out.println();  
  10. //排列后的值  
  11. for (int x=ll.size()-1;ll.size()>0&&x>=0;x--) {  
  12.     System.out.print(ll.get(x));  
  13. }  



这种方式还是针对10进制内相互转换有效,因为你不可能使用字母和数字去取模运算 
所以就有了数组代替纯数字的方式进行运算 

Java代码  收藏代码
  1. import java.util.HashSet;  
  2. import java.util.Random;  
  3.   
  4. public class ShortUrl {  
  5.     private static final String[] l = {   
  6.         "0""1""2""3""4""5""6""7""8""9",   
  7.         "a""b""c""d""e""f""g""h""i""j",  
  8.         "k""l""m""n""o""p""q""r""s""t",  
  9.         "u""v""w""x""y""z",   
  10.         "A""B""C""D""E""F""G""H""I""J",   
  11.         "K""L""M""N""O""P""Q""R""S""T",   
  12.         "U""V""W""X""Y""Z"};  
  13.       
  14.     private static int count = 100;  
  15.   
  16.     private static int getCount(){  
  17.         if(count>999)count = 100;  
  18.         return count++;   
  19.     }  
  20.       
  21.     //TentoN(这里是你想转换的数 ,这里是你想转换为多少进制 2-62之间)  
  22.     public static String TentoN(long value, int number) {  
  23.         if (number <= 1 || number > l.length) {  
  24.             throw new RuntimeException("Faild");  
  25.         }  
  26.         //负数处理  
  27.         if (value < 0) {  
  28.             return "-" + TentoN(0 - value, number);  
  29.         }  
  30.         if (value < number) {  
  31.             return l[(int)value];  
  32.         } else {  
  33.             long n = value % (long)number;  
  34.             return (TentoN(value / number, number) + l[(int)n]);  
  35.         }  
  36.     }  
  37.   
  38.     /** 
  39.      * 返回4位随机数 
  40.      * @return 
  41.      */  
  42.     public static Integer getRandom2(){  
  43.         Integer i = new Random().nextInt(9999);  
  44.         while(i<1000)    i=i<<1;  
  45.         return i;  
  46.     }  
  47.       
  48.     public static void main(String[] args) throws InterruptedException {  
  49.         long a = System.currentTimeMillis();  
  50.         HashSet<String> hs = new HashSet<String>();  
  51.         for(int i=0;i<1000;i++){  
  52.             String s = TentoN((System.currentTimeMillis()-1323333000000L), 62)+TentoN((long)getCount(),62);  
  53.             hs.add(s);  
  54.             System.out.println(s);  
  55.         }  
  56.         System.out.println(hs.size());  
  57.           
  58.         long b = System.currentTimeMillis();  
  59.         System.out.println("毫秒:"+(b-a));  
  60.     }  
  61. }  



2011-12-08 18:48 循环1000次后运行后得到的最后几条结果 
1000次无重复,耗时47毫秒 
yMV53b 
yMV53c 
yMV53d 
1000 
毫秒:47 

不过没多长时间,数据长度就涨到了8位啦~ 

对于微博来说生成一个短链接其实不难,主要的还是防止重复,如果使用10进制的数字方式进行保存的话数据量会非常惊人,也许起初的时候还是百位千位或者万位,后面随着数据量的递增,长度会越来越大,因此使用多进制的方式可以放缓数据递增的问题 
这里我考虑的还是简单的毫秒数计算方式。 
使用System.currentTimeMillis()我们可以获得一个13位的当前时间的毫秒数,当然直接使用的话没有问题,不过为了生成数据的长度我们尽可能将他的开始时间提前,比如一个项目2012年才开始使用,我们就没有必要非从1970年那个节点开始,如上面的代码我随便减去了一个毫秒数 1323333000000L 具体是什么时候我们没有必要去了解,这个只是为了减少时间差及最后生成的短链接长度而做的一步操作 
如果你减去了的正好的当前时间,那么生成的短链接就只有1位了 

高并发的问题,实际使用中肯定会存在一个问题,那就是多个用户同一时间内进行了一个操作,结果就是多条记录返回的值是相同的,开始的时候我考虑的是使用随机数的方式,不过随机数并不是一个万全的解决方法,因为随机并不表示不会相同,也许就会2个用户杯具的得到了同一个随机数,那么数据库的唯一条件就被破坏了 
解决方法其实也不难,如果对于含有订单的项目可以使用流水号作为扩展字符将结果唯一化 
不过订单的长度有时候也不会是短位数。 
比较简单的方法就是使用一个全局唯一的计数器。 
通过getCount方法我们可以在1毫秒内最多获得900个不会重复的3位数字 
当然我们没有必要每毫秒都去重置这个计数器,因为即使2毫秒得到了1800个数据也不会重复,因为前面的系统毫秒数已经改变了 

已知存在的问题:随着时间的推移,几天 几年后,毫秒数的增加肯定会使数据长度不断增加,这个还是根据实际需要去修改吧,对于数据量较少的,比如一天的数据量远远小于百位的,使用ddMMyyyy 日 月 年 加上补位数就可以满足变化的需求了,因为年月日方向颠倒 也可以增加扰码度防猜测 

好了所有相关的部分都简单介绍完了,具体的使用需要的人们再继续研究好了,也希望有更好解决方法的童鞋们慷慨贴出代码来分享 

 

转自  http://happysoul.iteye.com/blog/1299144

分享到:
评论

相关推荐

    在线生成短链接的原因及实现工具.docx

    在线生成短链接是一种常见的互联网实践,它通过将冗长的URL转化为简短的字符串,带来了诸多益处。短链接的主要作用在于优化分享、提高用户体验、便于数据追踪以及增强链接的安全性。 首先,缩短内容长度是生成短...

    URL 长连接变短链接的方法

    在Android开发中,有时我们需要将较长的URL转换为较短的形式,这通常被称为URL短链接服务。长链接可能由于各种原因需要变短,比如为了在社交媒体上更方便地分享,或者为了美观和易于记忆。本篇文章将深入探讨在...

    短链接生成系统源码-网址生成系统-短链防红域名系统.zip

    短链接生成系统是一种常见的互联网工具,它通过将长网址转换为较短的、易于记忆的链接,方便用户分享和传播。这种系统的核心在于其背后的算法和技术实现,包括URL编码、哈希函数、数据库管理和分布式系统设计等。接...

    最新抖音快手防红短链接生成系统网站源码

    抖音快手防红短链接生成系统网站源码,现在不管是做短视频,还是网站,防红都是至关重要的一步,源码已经修复完毕,自带八条接口,可任意使用。源码搭建简单,支付对接了第三方个人签,对接自带API文档提供下载,非常好用的...

    短链接批量生成工具

    短链接批量生成工具是一种高效便捷的在线营销工具,主要用于优化长网址,使其更便于分享、记忆和跟踪。在数字化营销领域,短链接被广泛应用于社交媒体、电子邮件、短信、广告等多种场景,因为它们不仅节省空间,还能...

    批量短链接转换工具

    在IT行业中,短链接服务是一种常见的互联网工具,它主要用于将长网址缩短,便于分享和记忆。批量短链接转换工具则是这种服务的高级形式,能够帮助用户一次性处理多个长链接,将其转化为简短的URL,提高社交网络上的...

    长链接异步联网转换为短链接

    这个是一个Android Demo, 利用百度长连接转为短链接的接口,异步联网调用。把我们平时用到的那些长连接转为短链接,这样可以省去一些资源,发短信,转为二维码都可以省下很大空间。此Demo 是在Edittext里面填好你的...

    长链接转短链接

    2. RESTful API:为实现短链接的生成和解析,可以设计RESTful API,如GET请求用于解析短链接,POST请求用于生成短链接。 3. 安全考虑:短链接可能会被恶意利用,因此需要对短链接进行加密,增加安全性。同时,设置...

    .net auto generate url短链接

    在IT行业中,短链接(Short URL)是一种广泛应用于网络服务中的技术,它的主要目标是将冗长、复杂的URL转换为简短、易于记忆的形式。在".net auto generate url短链接"这个主题中,我们将深入探讨如何使用.NET框架来...

    2021最新PHP短网址生成系统短链接生成系统URL缩短器系统源码.zip

    6. **自定义短链接**:某些系统允许用户自定义短链接,这需要额外的处理逻辑来确保唯一性和可用性。 7. **性能优化**:对于高流量的短网址服务,可能需要考虑缓存策略,比如使用Redis或Memcached存储热门链接,减少...

    2023最新防红短链接在线生成源码内置接口无广告.zip

    《2023最新防红短链接在线生成源码内置接口无广告》 在这个数字化的时代,网站和应用程序的安全性越来越受到重视。防红短链接,全称“防止被红包钓鱼的短链接”,是一种用于保护用户免受恶意链接攻击的技术。2023年...

    java短链接生成.zip

    在IT行业中,短链接生成是一项常见的需求,尤其在社交媒体、营销推广和数据分析等领域。这个名为"java短链接生成.zip"的压缩包文件提供了一个基于SpringBoot框架的Java实现,用于生成短链接。让我们深入探讨一下这个...

    基于PHP7.0+的短链接服务

    在IT行业中,短链接服务是一种常见的工具,尤其在社交媒体、营销推广和数据分析中广泛应用。它通过将冗长的URL转化为简短的字符串,方便分享,同时也便于管理和追踪。本项目基于PHP7.0以上版本构建,提供了一种简单...

    短链接生成及返回访问源码

    在IT行业中,短链接是一种广泛应用于社交媒体、营销活动和数据分析的技术。它通过将长的URL转换为较短的形式,使得分享更容易,同时也提高了美观性。本文将深入探讨短链接生成及返回访问的原理,并结合提供的源码...

    URL短链接服务Shortme.zip

    使用Golang编写的URL短链接服务。当前版本1.2.0。 Shortme的特点 相同的URL对应成不同的短链接 提供了short和expand的api。expand的api通过HTTP的307状态码进行重定向 黑...

    TP5url短链接生成与跳转

    TP5短链接生成与跳转,短链接生成 地址:http://t.cn/setshorturl.html?sign=xxxxxxxxxxxxxxxxx post参数: urls 原链接地址 必填 title 描述信息 非必填 返回值: { "status": 0, "msg": "短链接生成成功", "data":...

    墨众短链接系统 v1.0.0 快速搭建私有化短链接管理系统,支持多终端展示

    魔众短链接系统,帮您快速搭建私有化短链接管理系统形象。 魔众短链接系统采用 PHP+Mysql 架构,是一款对 SEO 非常友好、功能全面、安全稳定、支持多终端展示,帮您快速创建现代化的企业形象。 魔众短链接系统发布 v...

    Go-shorturl短链接算法

    在IT行业中,短链接服务是一种常见的工具,它将冗长的URL转换为简短的、易于记忆和分享的形式。Go语言作为一门现代化的系统编程语言,因其高效、简洁的特性,常被用于构建这种类型的服务。本文将深入探讨"Go-short...

    魔众短链接系统v1.0.0 快速搭建私有化短链接管理系统+支持多终端展示

    魔众短链接系统,帮您快速搭建私有化短链接管理系统形象。 魔众短链接系统采用 PHP+Mysql 架构,是一款对 SEO 非常友好、功能全面、安全稳定、支持多终端展示,帮您快速创建现代化的企业形象。 魔众短链接系统发布 ...

    Java微信长链接转短链接

    使用微信接口制作的转短链接工具,需要有自己的微信测试号或者公众号生成的accesstoken,配置jdk环境变量才能使用(由于使用了exe4j打包,提示配置EXE_JAVA_HOME是和jdk环境变量一样的配置方法)

Global site tag (gtag.js) - Google Analytics