当前位置:首页 > 短网址资讯 > 正文内容

使用60进制的程序仿了一个新浪微博短链接生成器

www.ft12.com8年前 (2017-06-11)短网址资讯5800

与其说仿新浪短网址其实算是个嚼头,招引人们的眼球,对于常规的进制算法可以去参看数据结构一书 
通过取模方式计算出对应的n进制数,t.cn短网址的原理大致如下:

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. }  

2017-03-14 09:56 循环1000次后运行后得到的最终几条成果 
1000次无重复,耗时47毫秒 
yMV53b 
yMV53c 
yMV53d 
1000 
毫秒:47 

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

高并发的疑问,实际运用中肯定会存在一个疑问,那就是多个用户同一时刻内进行了一个操作,成果就是多条记录返回的值是一样的,开端的时分我思考的是运用随机数的办法,不过随机数并不是一个万全的解决办法,由于随机并不表明不会一样,也许就会2个用户杯具的得到了同一个随机数,那么数据库的仅有条件就被破坏了 
解决办法本来也不难,假如对于含有订单的项目可以运用流水号作为扩展字符将成果仅有化 
不过订单的长度有时分也不会是短位数。 
比较简略的办法就是运用一个全局仅有的计数器。 
通过getCount办法咱们可以在1毫秒内最多取得900个不会重复的3位数字 
当然咱们没有必要每毫秒都去重置这个计数器,由于即便2毫秒得到了1800个数据也不会重复,由于前面的体系毫秒数已经改变了 

对于微博来说生成一个短链接本来不难,首要的仍是防止重复,假如运用10进制的数字办法进行保存的话数据量会非常惊人,也许起初的时分仍是百位千位或者万位,后面跟着数据量的递加,长度会越来越大,因而运用多进制的办法可以放缓数据递加的疑问 
这里我思考的仍是简略的毫秒数计算办法。 
运用System.currentTimeMillis()咱们可以取得一个14位的当时时刻的毫秒数,当然直接运用的话没有疑问,不过为了生成数据的长度咱们尽可能将他的开端时刻提前,比方一个项目2012年才开端运用,咱们就没有必要非从2008年那个节点开端,如上面的代码我随便减去了一个毫秒数 1323333000000L 详细是什么时分咱们没有必要去了解,这个只是为了减少时刻差及最终生成的短网址长度而做的一步操作 
假如你减去了的正好的当时时刻,那么生成的短连接就只有1位了 
已知存在的疑问:跟着时刻的推移,几天 几年后,毫秒数的添加肯定会使数据长度不断添加,这个仍是根据实际需要去修改吧,对于数据量较少的,比方一天的数据量远远小于百位的,运用ddMMyyyy 日 月 年 加上补位数就可以满意改变的需求了,由于年月日方向颠倒 也可以添加扰码度防猜测 

好了所有相关的部分都简略介绍完了,详细的运用需要的大家再持续研究好了,也希望有非常好解决办法的童鞋们大方贴出代码来分享 

扫描二维码推送至手机访问。

版权声明:本文由短链接发布,如需转载请注明出处。

本文链接:https://www.ft12.com/article_189.html

分享给朋友:

相关文章

马云又有新动作!天猫小店来了,颠覆传统小卖部!

140平米,8年时光,两代超市,两代人。这家超市位于浙江大学玉泉校区北门的西溪路上,是黄安的父亲黄海东一手做起来的小店,但随着年纪的增长和周边连锁便利店竞争的加剧,他显得有点力不从心。一年前,他“连哄带骗”地让黄安从杭州行政服务中心离职,一...

FT12短网址:Tcp长连接与短连接对高并发的影响

1、Tcp树立连接需求三次握手,断开连接需求四次握手。2、tcp树立连接后将会在操作系统内核内存中保护四元组方针(源ip,源port,方针ip,方针port)。3、tcp在断开连接时,自动断开方四元组将会处于time_wait状况,一起源p...

人工智能在六大领域中的应用与展望

人工智能在六大领域中的应用与展望

[FT12短网址 ] 科学技术是第一生产力,科技进步正在成为推进经济发展的重要推动力,对中国经济发展的贡献率已经上升到56.2%。面对正在兴起的人工智能浪潮,如何占据行业发展制高点,如何促进与实体经济深度融合,形成新增长点?“加快建设制造强...

不是外链没用,而是你发的外链没用

不是外链没用,而是你发的外链没用

网站外部链接的价值取决于你对链接的维度是否掌握到位,百度曾公开发布过一篇文章关于谈外链判断由于现在发布的博客外链,论坛外链这类人为性链接效果越来越低,造成了SEO圈子里面各种外链无用论说法。其实不是外链没用,而是你发的外链没用(不建立具备推...

校园贷后又现整容贷,校园金融到底怎么了?

继校园贷引发的悲剧被媒体大肆报道后,整容贷又被推到舆论的风口浪尖。FT12短网址的小编奉劝各位爱美的同学,还是要量力而为呀!近年来,在互联网金融的强势推动下,我国的消费贷款迎来爆发式的增长。数据显示,2008年到2016年,我国消费性贷款余...

技术漫谈:为何KPI毁了索尼,而OKR却成就了谷歌?

作者|李运华编辑|小智从技术 leader 的角度出发,看技术人绩效考核的痛。大多数公司里面总会因为 KPI 的考核方式而存在各种各样的问题,OKR 是一个在硅谷互联网公司比较流行的做法。怎样去理解 OKR 这个概念,并在技术团队中推行,从...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。