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

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

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

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

分享给朋友:

相关文章

不用登陆新浪微博就能t.cn短链接在线生成

 t.cn短链接大家应该都很熟悉,很多网友在日常中也经常用到。但是,要生成t.cn短网址有点小麻烦,那就是必须要先登陆微博,然后在微博上发布长网址,他才会生成一个对应的短网址上面这个流程非常的麻烦,那么有什么更简单的方法来生成新浪…

如何成为牛逼的产品经理?硅谷连续创业者这样说

如何成为牛逼的产品经理?硅谷连续创业者这样说

编者注:Jim Patterson,“大麻界的Uber”Eaze的首席执行官,深谙产品之道的企业家,曾联合创办包括DineOnMe、AudioCaseFiles、Zinc在内的多家公司,并曾担任过诸多企业的首席产品官。 五年前,Clove…

看了那么多SEO教程,为何你还是搞不定排名?

看了那么多SEO教程,为何你还是搞不定排名?

前言:本文独家原创首发卢松松博客,转载请保留作者联系方式与原文出处!前些天和一个朋友在讨论互联网营销的时候偶然提到了SEO优化,朋友说去年买了一套SEO教程自学,到目前为止,差不多将近一年了,排名还是非常的不好(几乎没有排名)。我问他既然看…

论坛私信推广的准确操作姿态

论坛私信推广的准确操作姿态

本人操作过的项目许多,每一个简直都是从零起步,从没想过把一切资源整合到一同,错过了太多用户,错过了太多粉丝,我在短网址行业没有一个兄弟,多年来陪我的即是那几台电脑和日夜运行的软件。但是今天我不是来抱怨的,言归正传,分享给咱们一个亲自操作的案…

苦逼SEO如何实现自身价值的提升?

苦逼SEO如何实现自身价值的提升?

昨天收到一个读者的留言,说目前SEO发展越来越难做,SEOer越来越难生存,于是笔者就与这位朋友聊了起来,了解到他目前在一家企业做短网址,发展不是很好,每天累死累活,老板却认为没好好做事,多少苦逼SEO心里是哑巴吃黄莲的感觉?之前咨询这样的…

短网址生成器哪个好用?多维度对比

目前市面上很多各式各样的短网址生成器,但是,到底哪个生成器最好用呢?首先,我们要从各个方面去分析。其一,短网址的打开速度和便利性。ft12短网址在这方面就有得天独厚的优势。他集合了u6.gg, rrd.me , c7.gg ,kks.me…

发表评论

访客

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