当前位置:首页 > 短网址资讯

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

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

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

分享给朋友:

相关文章

简单高效的短网址生成服务C#实现

简单高效的短网址生成服务C#实现

项目中有一处需求,需要把长网址缩为短网址,把结果通过短信、微信等渠道推送给客户。刚开始直接使用网上现成的开放服务,然后在某个周末突然手痒想自己动手实现一个别具特色的长网址(文本)缩短服务。由于以前做过socket服务,对数据包的封装排列还有…

PHP编程需要掌握的20个要点,能极大提高效率

PHP编程需要掌握的20个要点,能极大提高效率

[摘要] 用单引号取代双引号来包括字符串,这样做会更快一些。由于PHP会在双引号包抄的字符串中征采变量,单引号则 不会,留意:只要echo能这么做,它是一种能够把多个字符串看成参数的“函数”用单引号取代双引号来包括字符串,这样做会更快一些。…

闫东论百度大脑的谋和断---2017

闫东论百度大脑的谋和断---2017

[ ft12短网址导读 ] 国之谋断,家之谋断咱们做生态化,城市之谋断咱们做城镇化,咱们称之为一基地四中心。聚集当地生态,完成当地智能化生态的改造。家事国务天下事,离不开大数据的有备无患,也离不开人工智能的抓住时机。将来智能和工业…

5年内90%的印度初创企业将面临倒闭 原因是缺乏创新

5年内90%的印度初创企业将面临倒闭 原因是缺乏创新

近年来,印度已经开始被看做“全球第三大的新兴企业生态系统”,但成功的创新却似乎很缺乏。尽管印度初创公司的市场估值在过去4年里实现了大幅攀升,但最近由IBM商业价值研究院(IBV)与牛津经济学研究所(Oxford Economics)联合发布…

摩拜单车发布“摩拜+”战略 过半新用户来自微信小程序

5月19日消息,摩拜单车在北京举行发布会,正式宣布“摩拜+”开放平台战略,全面布局“生活圈”、“大数据”和“物联网”三大开放平台。中国联通(微博)、招商银行、中国银联、百度地图等8大品牌成为摩拜“生活圈”的首批战略合作伙伴。 此外,摩拜单…

匿名聊天小程序上线即遭微信封杀 还是腾讯投的

第一款“刷屏”朋友圈的小程序,上线不久就遭到了微信的封禁。 从5月18日晚上开始,一款名为“匿名聊聊”的应用在朋友圈刷屏。 在“匿名聊聊”小程序中,朋友圈直接识别二维码,输入3位聊天口令,就能跟分享小程序码的朋友匿名聊天。 然而,还没…

发表评论

访客

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