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

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

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

与其说仿新浪短网址其实算是个嚼头,招引人们的眼球,对于常规的进制算法可以去参看数据结构一书 
通过取模方式计算出对应的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

分享给朋友:

相关文章

奶奶的“漫漫”

奶奶的“漫漫”

昨天下了一天雨,以前习惯跑的路有泥洼,换到马路上去跑了五公里,看见一路的农家乐,招牌菜居然是烤全羊。跑步回来,我奶奶就向组织报告:“后院枣树上还有枣,你妈之前打算给你打了放冰箱的,晓得你要漫漫,我让她给你留了点儿。”她懂我喜欢的浪漫。我回家...

ofo飞鸽代工厂探访:一分钟造4辆车

ofo飞鸽代工厂探访:一分钟造4辆车

共享单车竞争趋于“白热化”的同时,各地方正在赶紧办理整治乱停乱放。大家不禁思考,这些单车终究产于何处?怎样的流程才能让单车在短时间内大批下线?带着疑问,短网址资讯小编走进天津飞鸽自行车厂,对ofo出产线进行了实地看望。  在这家位于天津市区...

幸存者偏差:实现成功不是复制成功者,而是学习失败者

幸存者偏差:实现成功不是复制成功者,而是学习失败者

转眼2018年已即将接近尾声,新的2019即将到来。时间飞逝,是否今年还未来得及回忆?还是徘徊在自己的一事无成中?FT12短网址的小编今天分享一篇心灵鸡汤,预祝大家的即将到来的2019年能否有所成就。1英国著名魔术师和催眠师德伦·布朗在一个...

淘宝&支付宝:连续一段时间未登录将销号

淘宝&支付宝:连续一段时间未登录将销号

日前阿里巴巴对旗下淘宝、支付宝平台的服务协议进行了修改,对于用户的权利和义务进行了更细致的界定,同时规定在淘宝、支付宝平台的非活跃用户在一定时间之后将会进行销号处理。淘宝平台方面,此次新增加规定,用户不得以任何方式转让,否则淘宝平台有权追究...

短网址公司反腐的力度正在逐渐加强

过去短网址行业的糜烂,是大公司的专利,阿里巴巴出个阎利珉,更早之前,百度反掉了好几个副总裁,视频网站收购是重灾区,腾讯的刘春宁,优酷的卢梵溪……反倒是近来两年疯狂购剧的爱奇艺没出来啥丑闻,不知道是时分未到仍是真的内控做得好。2012年后被职...

最久29分钟送达?又一家“智能零售”超市

最久29分钟送达?又一家“智能零售”超市

【FT12短网址】8月2日消息,亿邦动力网获悉,雅堂小超与饿了么蜂鸟配送签署战略合作。此次合作雅堂小超将推出定时精准配送等一系列重磅内容,双方将在智能零售即时配送领域展开深入合作。据相关统计数据表明,中国零售行业的总规模已达到4.5万亿美元...

发表评论

访客

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