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();的更多相关文章

  1. 自定义GUID类

    今天,同事发了个邮件说需要一个内部使用的GUID类,而不是System.Guid 结构体.什么意思呢? 例如public void Test(string guidPara) 这个方法的参数是个str ...

  2. 微软的COM中GUID和UUID、CLSID、IID

    摘自:http://blog.csdn.net/zhongguoren666/article/details/6711396 当初微软设计com规范的时候,有两种选择来保证用户的设计的com组件可以全 ...

  3. JS 生成GUID

    js 代码: function GUID() { this.date = new Date(); /* 判断是否初始化过,如果初始化过以下代码,则以下代码将不再执行,实际中只执行一次 */ if (t ...

  4. 有序GUID

    背景 常见的一种数据库设计是使用连续的整数为做主键,当新的数据插入到数据库时,由数据库自动生成.但这种设计不一定适合所有场景. 随着越来越多的使用Nhibernate.EntityFramework等 ...

  5. 多数据库有序GUID

    背景 常见的一种数据库设计是使用连续的整数为做主键,当新的数据插入到数据库时,由数据库自动生成.但这种设计不一定适合所有场景. 随着越来越多的使用Nhibernate.EntityFramework等 ...

  6. .Net:System.Guid

    ylbtech-.Net:System.Guid 1.返回顶部 1.public static Guid NewGuid(); // // 摘要: // 初始化 System.Guid 结构的新实例. ...

  7. 针对多类型数据库,集群数据库的有序GUID

    一.背景 常见的一种数据库设计是使用连续的整数为做主键,当新的数据插入到数据库时,由数据库自动生成.但这种设计不一定适合所有场景. 随着越来越多的使用Nhibernate.EntityFramewor ...

  8. 可排序的 COMB 类型 GUID

    最新代码在这儿:CombGuid.cs 首先这里不做GUID与整形作为主键的优劣之争,GUID自有它优势,但GUID本身是乱序的,会对索引的维护带来性能上的损耗,数据量越大越明显. COMB 类型 G ...

  9. SQL Server 有序GUID,SequentialGuid,

    问题描述 有序的GUID性能对比,堪比自增ID integer 一个大神告诉我NEWSEQUENTIALID() 在数据迁移的时候会有问题(感谢大神指点),所以我就深挖一下这个函数. 关于NEWSEQ ...

随机推荐

  1. .Net Core使用IConfiguration来处理Json文件

    前几天公司的用上了携程的开源配置中心:Apollo 然后同事给我提了这么个问题,因为之前的时候我们用的都是.NET Core自带的appsetting.json,为了兼容代码的目前工具类中用来进行配置 ...

  2. 没看这篇干货,别和我说你会IDEA Debug

    所谓工欲善其事必先利其器,现在idea已经成为java开发者眼中最热门最好用的IDE了.下面这篇文章将总结下idea调试的一些高级技巧. 多线程调试 直接上例子说明,比如下面这段代码 debug模式下 ...

  3. 【ABAP系列】SAP ABAP中使用for all entries in小结

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP中使用for a ...

  4. redis 设置密码 和 redis.config文件

  5. String类为什么是final

    String 本身一个对象,对象在jvm启动的时候就要实例化和其他类调用就要实例化,第一性能,第二安全,因为string的高频繁的使用,如果被继承,哪里性能将会大大降低,因为不能被继承,换句话来说就比 ...

  6. Python3的基本数据类型

    2.1. Python3中六个标准的基本数据类型: Number(数字) String(字符串) Sets(集合) Tuple(元组) List(列表) Dictionary(字典) 2.2. Pyt ...

  7. [19/05/04-星期六] 正则表示式(Regular Expression)

    一.概念 语法: \D :就是不是0-9数字的其它字符: \W:与\w相反: a\d?b:表示在字符a和b之间可以有一个数字或者没有数字都可以:如:ab .a3b a\d+b:表示在字符a和b之间至少 ...

  8. 【mysql】select子句顺序

    sleect…from (1)where (2)group by (3)having (4)order by (5)limit

  9. <每日一题> Day2:CodeForces-1141C.PolycarpRestoresPermutation(思维题)

    原题链接 参考代码: #include <iostream> #include <cstring> using namespace std; + , INF = 0x3f3f3 ...

  10. 什么是Azkaban?

    Azkaban是什么 Azkaban是由Linkedin开源的做批量工作流任务的调度器.在一个工作流内按照特定的顺序运行一组工作和流程.Azkaban定义了一种KV文件格式来建立任务之间的相互依赖关系 ...