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. js将html转换为纯文本

    document.body.textContent//firefox浏览器 document.body.innerText//适用ie webkit浏览器 document.body.innerHTM ...

  2. 深入理解webpack(三) babel之配置文件

    一:理解 babel之配置文件.babelrc 基本配置项 1. 什么是babel? 它是干什么用的? ES6是2015年发布的下一代javascript语言标准,它引入了新的语法和API,使我们编写 ...

  3. sorted()与sort()函数

    1 sorted可以对series,ndarry,list类型进行排序 默认会从小到大进行排序 arr1 = np.array([1,2,3,4,44,3243,43,8678]) print(sor ...

  4. node和数据库建立连接

    var express = require('express') , app = express(); var querystring = require('querystring'); var ut ...

  5. mysql续集(查询部分)

    mysql查询部分,从基础的查询到关键字,where子句,group by, order by, limit ,having,子查询分为from子查询和where子查询,左连接和右连接,内连接的连表查 ...

  6. 词频统计小程序-WordCount.exe

    一. 背景 ​ 最近顶哥为了完成学历提升学业中的小作业,做了一个词频统计的.exe小程序.因为当时做的时候网上的比较少,因此顶哥决定把自己拙略的作品发出来给需要的人提供一种思路,希望各位看官不要dis ...

  7. python之设置windows背景图片

    #!/usr/bin/env python3 # -*- coding: utf-8 -*- __author__ = 'jiangwenwen' from PIL import Image impo ...

  8. 8、神经网络:表述(Neural Networks: Representation)

    8.1 非线性假设 我们之前学的,无论是线性回归还是逻辑回归都有这样一个缺点,即:当特征太多时,计算的负荷会非常大. 下面是一个例子: 当我们使用x1, x2 的多次项式进行预测时,我们可以应用的很好 ...

  9. Webpack4、iView、Vue开发环境的搭建

    导读 项目使用了 yarn ,一个快速.可靠.安全的依赖管理工具.yarn 是一个类似于npm的包管理工具,它是由 facebook 推出并开源,它在速度,离线模式,版本控制的方面具有独到的优势.此项 ...

  10. Python中map和reduce函数??

    ①从参数方面来讲: map()函数: map()包含两个参数,第一个是参数是一个函数,第二个是序列(列表或元组).其中,函数(即map的第一个参数位置的函数)可以接收一个或多个参数. reduce() ...