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

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

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

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

分享给朋友:

相关文章

特斯拉宣布与上海电气合作 将在上海建厂

【FT12短网址资讯】日前咱们获悉,6月22日上午,在上海市人民政府见证下,特斯拉同上海电气签署了合资结构协议。依据两边合作协议,特斯拉携手上海电气集团股份有限公司将在上海临港开发区建立在我国的首家工厂。  依据国家政策规定,特斯拉需要与最...

七个用户体验设计的小提示,助你建最佳的移动设计

好的规划处理了这两个疑问:它明晰重视用户的首要方针,并经过界面明晰度消除用户的一切妨碍。打开网页时,一般会显现登录墙。请记住,过早的强制注册也许致使超过85%的用户放弃商品。鄙人面的示例中,Soundcloud请求用户登录才能拜访运用的内容...

FT12短网址:惊爆一个用肉眼几乎无法分辨的钓鱼网站

FT12短网址:惊爆一个用肉眼几乎无法分辨的钓鱼网站

近期FT12短网址小编发现钓鱼网址越来越多,所以旧事重提,将这片很久以前的旧闻发出来,给广大用户提个醒,凡是多个心眼。这应该是用肉眼最难分辨的钓鱼网站,没有之一,不信你试试,能看出端倪吗?网站的 URL 地址显示的是苹果官网,网址旁边是安全...

环保部再出手,不达标的家居企业将于9月底被迫关闭

环保部再出手,不达标的家居企业将于9月底被迫关闭

[ FT12短网址 ] 日前,中央环保巡视组在各地进行大力度审查:①家居行业最彻底的新一轮大检查;②无法升级改造达标排放的,9月底前将被关闭;③企业有单不敢接,家居涨价是必然。图片来自“123rf.com.cn”【编者按】2017...

如何将微信公众号文章的复杂网址生成短网址

FT12短网址的小编分享一下微信公众号运营的一些小技巧。微信公众号的地址非常长,所以需要将网址缩短发送到一切讨论组或者朋友圈,这样会更好看一些,也避免由于网址过长导致的分行截断而不能点击打开的窘境。方法一:利用腾讯的短地址服务优先推荐腾讯的...

抗震救灾,最后我竟然跟灾民抢饭吃

FT12短网址的小编原来也是热心肠,在听到地震消息的时候,第一反应就是抗震救灾。手机上刷到地震消息的时候,我浑身的热血就燃起来了。随之络绎不绝的灾区报道,死难受伤群众的惨状更激起了我内心的感动与善良。不说了,我要去为祖国和人民做贡献了!但是...

发表评论

访客

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