Guid--调用Guid.genID();
package com.ufgov.ar.common.util; import java.net.InetAddress; /**
* <p>
* Title: 产生唯一标识 /**
* 前4个字节是IP地址,接着8个字节是系统时间,最后4个字节是计数器。 在数据库中存储可以使用 char(32) 类型,保存如下字符串
* bfa78274000000006661bea400000003,可以由 toString()方法得到。 也可以用getData() 获得
* byte[16] 进行处理。
*/ public class Guid extends Object {
static int counter = 0; byte[] guts; /**
* 产生一个新的Guid.
*/
private Guid() {
guts = nextGuid();
} public static String genID(){
return (new Guid()).toString();
} /**
* 产生一个唯一标识
*
* @return byte[]
*/
public synchronized static byte[] nextGuid() {
try {
// 前4字节为ip
byte[] ip = InetAddress.getLocalHost().getAddress();
counter++;
byte[] guid = new byte[16];
for (int i = 0; i < 4; i++) {
guid[i] = ip[i];
}
// 然后8字节为系统时间
byte[] timeAry = Guid.long2bytes(System.currentTimeMillis());
for (int i = 4; i < 12; i++) {
guid[i] = timeAry[i - 4];
}
// 然后4字节为计数器
byte[] counterAry = int2bytes(counter);
for (int i = 12; i < 16; i++) {
guid[i] = counterAry[i - 12];
}
return guid;
} catch (Exception e) {
throw new RuntimeException(e.getMessage(),e);
}
} /**
* 产生唯一标识的大写
*
* @return the string
*/
public String toString() {
StringBuffer sb = toStringBuffer(); // 32位格式
return (new String(sb)).toUpperCase();
} /**
* 将唯一标识转成大写
*
* @return the string,长度32,中间没有分隔符
*/
private StringBuffer toStringBuffer() {
StringBuffer str = new StringBuffer();
String s;
int ii; byte ip[] = new byte[4];
for (int i = 0; i < 4; i++) {
ip[i] = guts[i];
}
s = Integer.toHexString(bytes2int(ip));
ii = 8 - s.length();
for (int i = 0; i < ii; i++) {
s = "0" + s;
}
str.append(s); byte time[] = new byte[8];
for (int i = 4; i < 12; i++) {
time[i - 4] = guts[i];
}
s = Long.toHexString(bytes2long(time));
ii = 16 - s.length();
for (int i = 0; i < ii; i++) {
s = "0" + s;
}
str.append(s); byte count[] = new byte[4];
for (int i = 12; i < 16; i++) {
count[i - 12] = guts[i];
}
s = Integer.toHexString(bytes2int(count));
ii = 8 - s.length();
for (int i = 0; i < ii; i++) {
s = "0" + s;
}
str.append(s); return str;
} /**
* 获取Guid内容
*
* @return byte[]
*/
public byte[] getData() {
return guts;
} private synchronized static byte[] long2bytes(long lParam) {
byte[] byteAry = new byte[8];
for (int i = 0; i < 8; i++) {
byteAry[i] = (byte) (lParam >> ((7 - i) * 8));
}
return byteAry;
} private synchronized static byte[] int2bytes(int iParam) {
byte[] byteAry = new byte[4];
for (int i = 0; i < 4; i++) {
byteAry[i] = (byte) (iParam >> ((3 - i) * 8));
}
return byteAry;
} private synchronized static long bytes2long(byte[] byteAry) {
if (byteAry == null || byteAry.length != 8) {
return 0;
}
long l = 0;
for (int i = 0; i < byteAry.length; i++) {
l += byteAry[i] << ((7 - i) * 8);
}
return l;
} private synchronized static int bytes2int(byte[] byteAry) {
if (byteAry == null || byteAry.length != 4) {
return 0;
}
int ii = 0;
for (int i = 0; i < byteAry.length; i++) {
ii += byteAry[i] << ((3 - i) * 8);
}
return ii; } public static void main(String args[]) {
System.out.println( Guid.genID());
}
}
Guid--调用Guid.genID();的更多相关文章
- 自定义GUID类
今天,同事发了个邮件说需要一个内部使用的GUID类,而不是System.Guid 结构体.什么意思呢? 例如public void Test(string guidPara) 这个方法的参数是个str ...
- 微软的COM中GUID和UUID、CLSID、IID
摘自:http://blog.csdn.net/zhongguoren666/article/details/6711396 当初微软设计com规范的时候,有两种选择来保证用户的设计的com组件可以全 ...
- JS 生成GUID
js 代码: function GUID() { this.date = new Date(); /* 判断是否初始化过,如果初始化过以下代码,则以下代码将不再执行,实际中只执行一次 */ if (t ...
- 有序GUID
背景 常见的一种数据库设计是使用连续的整数为做主键,当新的数据插入到数据库时,由数据库自动生成.但这种设计不一定适合所有场景. 随着越来越多的使用Nhibernate.EntityFramework等 ...
- 多数据库有序GUID
背景 常见的一种数据库设计是使用连续的整数为做主键,当新的数据插入到数据库时,由数据库自动生成.但这种设计不一定适合所有场景. 随着越来越多的使用Nhibernate.EntityFramework等 ...
- .Net:System.Guid
ylbtech-.Net:System.Guid 1.返回顶部 1.public static Guid NewGuid(); // // 摘要: // 初始化 System.Guid 结构的新实例. ...
- 针对多类型数据库,集群数据库的有序GUID
一.背景 常见的一种数据库设计是使用连续的整数为做主键,当新的数据插入到数据库时,由数据库自动生成.但这种设计不一定适合所有场景. 随着越来越多的使用Nhibernate.EntityFramewor ...
- 可排序的 COMB 类型 GUID
最新代码在这儿:CombGuid.cs 首先这里不做GUID与整形作为主键的优劣之争,GUID自有它优势,但GUID本身是乱序的,会对索引的维护带来性能上的损耗,数据量越大越明显. COMB 类型 G ...
- SQL Server 有序GUID,SequentialGuid,
问题描述 有序的GUID性能对比,堪比自增ID integer 一个大神告诉我NEWSEQUENTIALID() 在数据迁移的时候会有问题(感谢大神指点),所以我就深挖一下这个函数. 关于NEWSEQ ...
随机推荐
- Jmeter上传文件、cookie、登录验证
2.11选择http请求 3.0 cookie 域:十九服务器ip或者域名 路径就是接口路径 登录验证:
- 45 MySQL自增id
45 MySQL自增id 表定义自增id 说到自增id,前面提到mysql的自增id不连续,当表定义的自增值达到上限后的逻辑是:再申请下一个id时,得到的值保持不变 ; insert into t v ...
- java通过HtmlUnit工具和J4L实现模拟带验证码登录
1.HtmlUnit 1.1介绍 HtmlUnit是一个用java编写的无界面浏览器,建模html文档,通过API调用页面,填充表单,点击链接等等.如同正常浏览器一样操作.典型应用于测试以及从网页抓取 ...
- JQuery weui 中的Popup (弹出层:底部)
//弹出层(从底部) <div id="bottomb" class="weui-popup__container popup-bottom"> & ...
- ementUi rules表单验证 --》Wangqi
ElementUi rules表单验证 ElementUi 表单验证 工作中常用到的JS验证 可以在pattern中书写正则,并且配合elementUI进行表单验证. pattern 属性规定用于 ...
- [Web 前端] 002 html 常用行行级元素
目录 1. html 常用的行级元素 1.1 链接标签 1.2 a 标签的锚点的使用 1.3 文本标签 1.4 无语义的行级元素 span 1.5 html 中的实体字符 1. html 常用的行级元 ...
- [Python3] 007 列表的遍历,你是 for 联盟还是 while 部落
目录 少废话,直接上例子 for 联盟 for 与 list 的简单合作 for 的老搭档 range() for 与嵌套列表(双层列表) for 从 if 那儿认识的 else 循环"三杰 ...
- Developer Express 第三方控件使用系列方法
本人目前从事的开发工作主要是以C#语言进行的相关C/S的开发,在工作中也要求使用Developer Express第三方控件所以这一系列的控件使用说明都将以C#语言进行代码说明.平时工作中会慢慢的收集 ...
- flume 进阶
一.flume事务 put事务流程: 1.doPut:将批量数据先写入临时缓冲区putList 2.doCommit:检查Channel内存队列是否足够, (1)达到一定时间没有数据写入到putLis ...
- D-query SPOJ 树状数组+离线
D-query SPOJ 树状数组+离线/莫队算法 题意 有一串正数,求一定区间中有多少个不同的数 解题思路--树状数组 说明一下,树状数组开始全部是零. 首先,我们存下所有需要查询的区间,然后根据右 ...