`
happysoul
  • 浏览: 403461 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

仿新浪微博短链接生成短链接(使用62进制)

    博客分类:
  • JAVA
阅读更多
说仿新浪其实算是个嚼头,吸引人们的眼球,对于常规的进制算法可以去参看数据结构一书
通过取模方式计算出对应的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 日 月 年 加上补位数就可以满足变化的需求了,因为年月日方向颠倒 也可以增加扰码度防猜测

好了所有相关的部分都简单介绍完了,具体的使用需要的人们再继续研究好了,也希望有更好解决方法的童鞋们慷慨贴出代码来分享
分享到:
评论

相关推荐

    新浪微博短网址生成器 新浪短网址 微博短网址 短网址网站源码

    而“新浪短网址”和“微博短网址”则特指与新浪微博相关的短网址服务,可能是由新浪官方提供,也可能是第三方开发的工具,兼容新浪微博平台。至于“短网址源码”,指的是实现这一功能的编程代码,可能是供开发者学习...

    新浪微博短网址生成器1.58

    短网址生成器就是一种把原来很长的网址缩短为很短的网址的工具,发表QQ空间说说、微博等,都有字数的限制,但这些社交媒体都能够自动转换短网址,其他媒介,比如QQ好友、群、签名、MSN、电子邮件、论坛签名以及手机...

    7.3 生成页面 |创建微博|Node.js-Koa2框架从零开发仿新浪微博项目实战

    7.3_生成页面_|创建微博|Node.js-Koa2框架从零开发仿新浪微博项目实战

    仿新浪微博的网站源码

    该压缩包文件包含的是一个仿新浪微博的网站源代码,它是一个基于Web开发的项目,用于构建类似新浪微博的社交网络平台。下面将详细解释这个项目可能涉及的一些关键知识点和技术。 1. **网站架构**:仿新浪微博的网站...

    基于python爬取新浪微博爬虫以及生成词云源码.zip

    基于python爬取新浪微博爬虫以及生成词云源码.zip基于python爬取新浪微博爬虫以及生成词云源码.zip基于python爬取新浪微博爬虫以及生成词云源码.zip基于python爬取新浪微博爬虫以及生成词云源码.zip基于python爬取...

    基于python爬取新浪微博爬虫以及生成词云源码(高分项目).zip

    基于python爬取新浪微博爬虫以及生成词云源码(高分项目).zip个人经导师指导并认可通过的98分大作业设计项目,主要针对计算机相关专业的正在做课程设计、期末大作业的学生和需要项目实战练习的学习者。 基于python...

    基于python爬取新浪微博爬虫以及生成词云代码+文档说明(高质量代码)

    基于python爬取新浪微博爬虫以及生成词云代码+文档说明(高质量代码),含有代码注释,新手也可看懂,个人手打98分项目,导师非常认可的高分项目,毕业设计、期末大作业和课程设计高分必看,下载下来,简单部署,就...

    仿新浪微博二维码

    【标题】:“仿新浪微博二维码”涉及的技术点主要集中在二维码生成和自定义设计上,特别是如何利用ZXing库来实现这一过程。ZXing,全称Zebra Crossing,是一个开源的、跨平台的条码读写库,支持多种类型的条码和...

    仿新浪微博jquery qtip ajax提示框

    【标题】"仿新浪微博jquery qtip ajax提示框"所涉及的知识点主要集中在前端开发领域,具体包括以下几个方面: 1. **jQuery**:jQuery是一个高效、简洁的JavaScript库,它简化了HTML文档遍历、事件处理、动画设计和...

    短链接生成系统源码-网址生成系统-短链防红域名系统.zip

    短链接生成系统是一种常见的互联网工具,它通过将长网址转换为较短的、易于记忆的链接,方便用户分享和传播。这种系统的核心在于其背后的算法和技术实现,包括URL编码、哈希函数、数据库管理和分布式系统设计等。接...

    仿微博HTML源码

    【标题】"仿微博HTML源码"所涉及的知识点主要集中在HTML页面设计和构建上,尤其是对于社交媒体平台界面的模仿。HTML(HyperText Markup Language)是网页开发的基础,用于定义网页内容的结构和布局。在"仿微博HTML...

    使用ssh仿新浪微博

    在这个工程案例中,我们将探讨如何使用SSH技术来构建一个类似新浪微博的平台。SSH不仅确保了数据传输的安全性,还提供了命令行接口,使得开发者可以远程管理服务器,执行脚本,以及进行各种自动化任务。 在构建这样...

    基于python爬取新浪微博爬虫以及生成词云源码+源代码+文档说明(高分项目)

    基于python爬取新浪微博爬虫以及生成词云源码+源代码+文档说明(高分项目)本资源中的源码都是经过本地编译过可运行的,评审分达到95分以上。资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、...

    新浪微博代码分享

    在本文中,我们将深入探讨如何实现“新浪微博代码分享”这一功能。这个项目是基于对新浪微博功能的模拟,旨在提供一个类似平台,用户可以在这里分享他们的想法、上传图片,并与他人互动。通过分析“JustShare”这个...

    最新抖音快手防红短链接生成系统网站源码

    抖音快手防红短链接生成系统网站源码,现在不管是做短视频,还是网站,防红都是至关重要的一步,源码已经修复完毕,自带八条接口,可任意使用。源码搭建简单,支付对接了第三方个人签,对接自带API文档提供下载,非常好用的...

    仿新浪微博的一个java+web中级项目Java源码

    该项目是一个基于Java技术栈开发的中级Web应用,旨在模拟新浪微博的功能。通过分析其源码,我们可以深入了解Java在Web开发中的应用以及相关技术的实践。以下是一些关键知识点的详细说明: 1. **Java Web开发基础**...

    TP5url短链接生成与跳转

    TP5短链接生成与跳转,短链接生成 地址:http://t.cn/setshorturl.html?sign=xxxxxxxxxxxxxxxxx post参数: urls 原链接地址 必填 title 描述信息 非必填 返回值: { "status": 0, "msg": "短链接生成成功", "data":...

    新浪微博逆向总结4-22.docx

    【Android逆向技术详解——以新浪微博为例】 在Android应用逆向工程中,主要目标是对应用程序进行分析,理解其内部逻辑,获取敏感信息或实现特定功能。在这个案例中,我们将聚焦于如何逆向新浪微博的账户登录验证...

    新浪微博签名apk

    本篇文章将详细解析“新浪微博签名apk”这一工具,帮助开发者更好地理解和使用它。 首先,我们要理解的是什么是签名。在Android系统中,每个应用程序在发布之前都需要进行签名,这是为了确保应用的来源可追溯,防止...

    java短链接生成.zip

    然后,为了确保生成的短链接更易读,可能会对哈希值进行进一步处理,比如取其一部分,或者通过某种编码方式(如Base62)将其转换为字母数字组合。 在项目内部,可能包含一个名为`short_url`的服务或者控制器,它是...

Global site tag (gtag.js) - Google Analytics