说仿新浪其实算是个嚼头,吸引人们的眼球,对于常规的进制算法可以去参看数据结构一书
通过取模方式计算出对应的n进制数
- int nv = 2; //进制
- int n = 4;
- List<Integer> ll = new ArrayList<Integer>();
- while (n >= 1) {
- ll.add(n%nv);
- System.out.print(n % nv + ",");
- n = n / nv;
- }
- System.out.println();
- //排列后的值
- for (int x=ll.size()-1;ll.size()>0&&x>=0;x--) {
- System.out.print(ll.get(x));
- }
这种方式还是针对10进制内相互转换有效,因为你不可能使用字母和数字去取模运算
所以就有了数组代替纯数字的方式进行运算
- import java.util.HashSet;
- import java.util.Random;
- public class ShortUrl {
- private static final String[] l = {
- "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
- "a", "b", "c", "d", "e", "f", "g", "h", "i", "j",
- "k", "l", "m", "n", "o", "p", "q", "r", "s", "t",
- "u", "v", "w", "x", "y", "z",
- "A", "B", "C", "D", "E", "F", "G", "H", "I", "J",
- "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T",
- "U", "V", "W", "X", "Y", "Z"};
- private static int count = 100;
- private static int getCount(){
- if(count>999)count = 100;
- return count++;
- }
- //TentoN(这里是你想转换的数 ,这里是你想转换为多少进制 2-62之间)
- public static String TentoN(long value, int number) {
- if (number <= 1 || number > l.length) {
- throw new RuntimeException("Faild");
- }
- //负数处理
- if (value < 0) {
- return "-" + TentoN(0 - value, number);
- }
- if (value < number) {
- return l[(int)value];
- } else {
- long n = value % (long)number;
- return (TentoN(value / number, number) + l[(int)n]);
- }
- }
- /**
- * 返回4位随机数
- * @return
- */
- public static Integer getRandom2(){
- Integer i = new Random().nextInt(9999);
- while(i<1000) i=i<<1;
- return i;
- }
- public static void main(String[] args) throws InterruptedException {
- long a = System.currentTimeMillis();
- HashSet<String> hs = new HashSet<String>();
- for(int i=0;i<1000;i++){
- String s = TentoN((System.currentTimeMillis()-1323333000000L), 62)+TentoN((long)getCount(),62);
- hs.add(s);
- System.out.println(s);
- }
- System.out.println(hs.size());
- long b = System.currentTimeMillis();
- System.out.println("毫秒:"+(b-a));
- }
- }
2011-12-08 18:48 循环1000次后运行后得到的最后几条结果
1000次无重复,耗时47毫秒
yMV53b
yMV53c
yMV53d
1000
毫秒:47
不过没多长时间,数据长度就涨到了8位啦~
对于微博来说生成一个短链接其实不难,主要的还是防止重复,如果使用10进制的数字方式进行保存的话数据量会非常惊人,也许起初的时候还是百位千位或者万位,后面随着数据量的递增,长度会越来越大,因此使用多进制的方式可以放缓数据递增的问题
这里我考虑的还是简单的毫秒数计算方式。
使用System.currentTimeMillis()我们可以获得一个13位的当前时间的毫秒数,当然直接使用的话没有问题,不过为了生成数据的长度我们尽可能将他的开始时间提前,比如一个项目2012年才开始使用,我们就没有必要非从1970年那个节点开始,如上面的代码我随便减去了一个毫秒数 1323333000000L 具体是什么时候我们没有必要去了解,这个只是为了减少时间差及最后生成的短链接长度而做的一步操作
如果你减去了的正好的当前时间,那么生成的短链接就只有1位了
高并发的问题,实际使用中肯定会存在一个问题,那就是多个用户同一时间内进行了一个操作,结果就是多条记录返回的值是相同的,开始的时候我考虑的是使用随机数的方式,不过随机数并不是一个万全的解决方法,因为随机并不表示不会相同,也许就会2个用户杯具的得到了同一个随机数,那么数据库的唯一条件就被破坏了
解决方法其实也不难,如果对于含有订单的项目可以使用流水号作为扩展字符将结果唯一化
不过订单的长度有时候也不会是短位数。
比较简单的方法就是使用一个全局唯一的计数器。
通过getCount方法我们可以在1毫秒内最多获得900个不会重复的3位数字
当然我们没有必要每毫秒都去重置这个计数器,因为即使2毫秒得到了1800个数据也不会重复,因为前面的系统毫秒数已经改变了
已知存在的问题:随着时间的推移,几天 几年后,毫秒数的增加肯定会使数据长度不断增加,这个还是根据实际需要去修改吧,对于数据量较少的,比如一天的数据量远远小于百位的,使用ddMMyyyy 日 月 年 加上补位数就可以满足变化的需求了,因为年月日方向颠倒 也可以增加扰码度防猜测
好了所有相关的部分都简单介绍完了,具体的使用需要的人们再继续研究好了,也希望有更好解决方法的童鞋们慷慨贴出代码来分享
转自 http://happysoul.iteye.com/blog/1299144
相关推荐
为什么要生成短链接呢?,到底生成短链接有哪些好处呢? 1、缩短内容长度,符合一些平台对字数的要求,也看起来更简洁。 2、需要数据统计时更简单 3、在类似微信这样一些平台传播更为简单。 4、带中文的链接可能无法...
抖音快手防红短链接生成系统网站源码,现在不管是做短视频,还是网站,防红都是至关重要的一步,源码已经修复完毕,自带八条接口,可任意使用。源码搭建简单,支付对接了第三方个人签,对接自带API文档提供下载,非常好用的...
这个是一个Android Demo, 利用百度长连接转为短链接的接口,异步联网调用。把我们平时用到的那些长连接转为短链接,这样可以省去一些资源,发短信,转为二维码都可以省下很大空间。此Demo 是在Edittext里面填好你的...
使用Golang编写的URL短链接服务。当前版本1.2.0。 Shortme的特点 相同的URL对应成不同的短链接 提供了short和expand的api。expand的api通过HTTP的307状态码进行重定向 黑...
魔众短链接系统,帮您快速搭建私有化短链接管理系统形象。 魔众短链接系统采用 PHP+Mysql 架构,是一款对 SEO 非常友好、功能全面、安全稳定、支持多终端展示,帮您快速创建现代化的企业形象。 魔众短链接系统发布 v...
TP5短链接生成与跳转,短链接生成 地址:http://t.cn/setshorturl.html?sign=xxxxxxxxxxxxxxxxx post参数: urls 原链接地址 必填 title 描述信息 非必填 返回值: { "status": 0, "msg": "短链接生成成功", "data":...
魔众短链接系统,帮您快速搭建私有化短链接管理系统形象。 魔众短链接系统采用 PHP+Mysql 架构,是一款对 SEO 非常友好、功能全面、安全稳定、支持多终端展示,帮您快速创建现代化的企业形象。 魔众短链接系统发布 ...
delphi开发微信API程序(长链接转短链接),自己写的,用微信提供的API,长链接转短链接。使用方便
使用微信接口制作的转短链接工具,需要有自己的微信测试号或者公众号生成的accesstoken,配置jdk环境变量才能使用(由于使用了exe4j打包,提示配置EXE_JAVA_HOME是和jdk环境变量一样的配置方法)
分享一个IAPP短链接生成源码,源码小巧,功能实用,有兴趣的可下载来学习一下 支持生成三种短链接 短链接,自定义短链接 带密码短链接,源码免费开源,源码仅供学习!
android 中长连接变短链接的几种方式集合,希望对大家有所帮助。。。
2020最新短链接(防洪‘红’缩短网址)源码,可以防红多模式,不需要对接别人的API,可以运营上夜班!
多条网址生成短链接多条网址生成短链接多条网址生成短链接多条网址生成短链接多条网址生成短链接多条网址生成短链接多条网址生成短链接多条网址生成短链接多条网址生成短链接多条网址生成短链接多条网址生成短链接多...
长链接转短链接
我们通常看到打开一个网页链接很长,感觉很臃肿,所以我们可采取短链接形式,还能加密链接,达到安全浏览
短链接批量生成工具 支持支持批量处理 文案处理 ,支持文章内直接压缩替换,用途不多说了~
Springboot写的java短链接生成器,编译运行即可生成短链接 内置API可以提供其他程序调用
帮你快速生成短链接,包括腾讯、微博等。就是你想要的。不需要上传
PHP防红短链接源码Shortny v2.0.1
2023最新防红短链接在线生成源码内置接口无广告