java生成唯一标识符有什么用
有时我们不依赖于数据库中自动递增的字段产生唯一ID,比如多表同一字段需要统一一个唯一ID,这时就需要用程序来生成一个唯一的全局ID,然后在数据库事务中同时插入到多章表中实现同步.
在java中有个类工具很好的实现产生唯一ID(UUID),但是由数字和字母及中划线组成的,故数据库字段应该设置为char 并相应的建立索引.
UUID是128位整数(16字节)的全局唯一标识符(Universally Unique Identifier).
指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的.通常平台会提供生成UUID的API.UUID按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址,纳秒级时间,芯片ID码和许多可能的数字.由以下几部分的组合:当前日期和时间(UUID的第一个部分与时间有关,如果你在生成一个 UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同),时钟序列,全局唯一的IEEE机器识别号(如果有网卡,从网卡获得,没有网卡以其他方式获得),UUID的唯一缺陷在于生成的结果串会比较长.关于UUID这个标准使用最普遍的是微软的GUID(Globals Unique Identifiers).
在ColdFusion中可以用CreateUUID()函数很简单的生成UUID,其格式为:xxxxxxxx- xxxx-xxxx-xxxxxxxxxxxxxxxx(8-4-4-16),其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字.而标准的UUID格式为:xxxxxxxx-xxxx-xxxx-xxxxxx-xxxxxxxxxx (8-4-4-4-12)
,可以从cflib 下载CreateGUID() UDF进行转换.
使用UUID的好处在分布式的软件系统中(比如:DCE/RPC, COM+,CORBA)就能体现出来,它能保证每个节点所生成的标识都不会重复,并且随着WEB服务等整合技术的发展,UUID的优势将更加明显.
关于UUID的更多信息可以多google 一下.
UUID含义是通用唯一识别码 (Unive
sally Unique Identifie
),这 是一个软件建构的标准,
也是
被开源软件基金会 (Open Softwa
e Foundation, OSF) 的组织在分布式计算环境 (Dist
i
uted Computing Envi
onment, DCE) 领域的一部份。UUID 的目的,是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。如此一来,每个人都可以建立不与其它人冲突的 UUID。在这样的情况下,就不需考虑数据库建立时的名称重复问题。目前最广泛应用的 UUID,即是微软的 Mic
osoft's Glo
ally Unique Identifie
s (GUIDs),而其他重要的应用,则有 Linux ext2
ext3 档案系统、LUKS 加密分割区、GNOME、KDE、Mac OS X 等等。
在java中有个类工具很好的实现产生唯一ID(UUID),但是由数字和字母及中划线组成的,故数据库字段应该设置为char 并相应的建立索引.
UUID是128位整数(16字节)的全局唯一标识符(Universally Unique Identifier).
指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的.通常平台会提供生成UUID的API.UUID按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址,纳秒级时间,芯片ID码和许多可能的数字.由以下几部分的组合:当前日期和时间(UUID的第一个部分与时间有关,如果你在生成一个 UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同),时钟序列,全局唯一的IEEE机器识别号(如果有网卡,从网卡获得,没有网卡以其他方式获得),UUID的唯一缺陷在于生成的结果串会比较长.关于UUID这个标准使用最普遍的是微软的GUID(Globals Unique Identifiers).
在ColdFusion中可以用CreateUUID()函数很简单的生成UUID,其格式为:xxxxxxxx- xxxx-xxxx-xxxxxxxxxxxxxxxx(8-4-4-16),其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字.而标准的UUID格式为:xxxxxxxx-xxxx-xxxx-xxxxxx-xxxxxxxxxx (8-4-4-4-12)
,可以从cflib 下载CreateGUID() UDF进行转换.
使用UUID的好处在分布式的软件系统中(比如:DCE/RPC, COM+,CORBA)就能体现出来,它能保证每个节点所生成的标识都不会重复,并且随着WEB服务等整合技术的发展,UUID的优势将更加明显.
关于UUID的更多信息可以多google 一下.
Java生成UUID
UUID(Universally Unique Identifier)全局唯一标识符,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的.按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址,纳秒级时间,芯片ID码和许多可能的数字.由以下几部分的组合:当前日期和时间(UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同),时钟序列,全局唯一的IEEE机器识别号(如果有网卡,从网卡获得,没有网卡以其他方式获得),UUID的唯一缺陷在于生成的结果串会比较长.
在Java中生成UUID主要有以下几种方式:
JDK1.5
如果使用的JDK1.5的话,那么生成UUID变成了一件简单的事,以为JDK实现了UUID:
java.util.UUID, 直接调用即可.
UUID uuid = UUID.randomUUID();
String s = UUID.randomUUID().toString();//用来生成数据库的主键id非常不错..
Java代码
package com.taobao.tddl.client.util;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.InetAddress;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.locks.ReentrantLock;
/**
* @author huangshang
*
*/
public class UniqId {
private static char[] digits = { '0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
private static Map<Character, Integer> rDigits = new HashMap<Character, Integer>(
16);
static {
for (int i = 0; i < digits.length; ++i) {
rDigits.put(digits[i], i);
}
}
private static UniqId me = new UniqId();
private String hostAddr;
private Random random = new SecureRandom();
private MessageDigest mHasher;
private UniqTimer timer = new UniqTimer();
private ReentrantLock opLock = new ReentrantLock();
private UniqId() {
try {
InetAddress addr = InetAddress.getLocalHost();
hostAddr = addr.getHostAddress();
} catch (IOException e) {
hostAddr = String.valueOf(System.currentTimeMillis());
}
if (hostAddr == null || hostAddr.length() == 0
|| "127.0.0.1".equals(hostAddr)) {
hostAddr = String.valueOf(System.currentTimeMillis());
}
try {
mHasher = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException nex) {
mHasher = null;
}
}
/**
* 获取UniqID实例
*
* @return UniqId
*/
public static UniqId getInstance() {
return me;
}
/**
* 获得不会重复的毫秒数
*
* @return
*/
public long getUniqTime() {
return timer.getCurrentTime();
}
/**
* 获得UniqId
*
* @return uniqTime-randomNum-hostAddr-threadId
*/
public String getUniqID() {
StringBuffer sb = new StringBuffer();
long t = timer.getCurrentTime();
sb.append(t);
sb.append("-");
sb.append(random.nextInt(8999) + 1000);
sb.append("-");
sb.append(hostAddr);
sb.append("-");
sb.append(Thread.currentThread().hashCode());
return sb.toString();
}
/**
* 获取MD5之后的uniqId string
*
* @return uniqId md5 string
*/
public String getUniqIDHashString() {
return hashString(getUniqID());
}
/**
* 获取MD5之后的uniqId
*
* @return byte[16]
*/
public byte[] getUniqIDHash() {
return hash(getUniqID());
}
/**
* 对字符串进行md5
*
* @param str
* @return md5 byte[16]
*/
public byte[] hash(String str) {
opLock.lock();
try {
byte[] bt = mHasher.digest(str.getBytes("UTF-8"));
if (null == bt || bt.length != 16) {
throw new IllegalArgumentException("md5 need");
}
return bt;
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("unsupported utf-8 encoding", e);
} finally {
opLock.unlock();
}
}
/**
* 对二进制数据进行md5
*
* @param str
* @return md5 byte[16]
*/
public byte[] hash(byte[] data) {
opLock.lock();
try {
byte[] bt = mHasher.digest(data);
if (null == bt || bt.length != 16) {
throw new IllegalArgumentException("md5 need");
}
return bt;
} finally {
opLock.unlock();
}
}
/**
* 对字符串进行md5 string
*
* @param str
* @return md5 string
*/
public String hashString(String str) {
byte[] bt = hash(str);
return bytes2string(bt);
}
/**
* 对字节流进行md5 string
*
* @param str
* @return md5 string
*/
public String hashBytes(byte[] str) {
byte[] bt = hash(str);
return bytes2string(bt);
}
/**
* 将一个字节数组转化为可见的字符串
*
* @param bt
* @return
*/
public String bytes2string(byte[] bt) {
int l = bt.length;
char[] out = new char[l << 1];
for (int i = 0, j = 0; i < l; i++) {
out[j++] = digits[(0xF0 & bt[i]) >>> 4];
out[j++] = digits[0x0F & bt[i]];
}
return new String(out);
}
/**
* 将字符串转换为bytes
*
* @param str
* @return byte[]
*/
public byte[] string2bytes(String str) {
if (null == str) {
throw new NullPointerException("参数不能为空");
}
if (str.length() != 32) {
throw new IllegalArgumentException("字符串长度必须是32");
}
byte[] data = new byte[16];
char[] chs = str.toCharArray();
for (int i = 0; i < 16; ++i) {
int h = rDigits.get(chs[i * 2]).intValue();
int l = rDigits.get(chs[i * 2 + 1]).intValue();
data[i] = (byte) ((h & 0x0F) << 4 | (l & 0x0F));
}
return data;
}
/**
* 实现不重复的时间
*
* @author dogun
*/
private static class UniqTimer {
private AtomicLong lastTime = new AtomicLong(System.currentTimeMillis());
public long getCurrentTime() {
return this.lastTime.incrementAndGet();
}
}
}
澳洲的葡萄酒怎样划分等级
酒品以五酒杯的评分系统进行评级:94-100 分是顶尖葡萄酒(Outstanding wines),90-93 分是强力推荐(Highly recommended),87-89分是推荐饮用(Recommended),84-86分是易于饮用(Acceptable),其中,只有94-100 分的酒品才可以获得五个杯子的标注,成为“五杯酒”标志葡萄酒,同时,一个酒庄中,拥有两款...
澳洲葡萄酒的分布
另外西澳大利亚也有少量的葡萄园。澳大利亚的葡萄酒之所以有如此的盛名,是因为其特有的优良土地和许多世界级杰出优秀的酿酒师,再加上世界上最严格的管理和生产过程,以及澳大利亚人特有的简单,纯朴,憨厚,不视金钱为唯一目的,而把信用和快乐生活视为第一追求的环境下,酿造出来的质优价廉的世界级美酒。...
澳大利亚红酒的分布
另外西澳大利亚也有少量的葡萄园。澳大利亚的葡萄酒之所以有如此的盛名,是因为其特有的优良土地和许多世界级杰出优秀的酿酒师,再加上世界上最严格的管理和生产过程,以及澳大利亚人特有的简单,纯朴,憨厚,不视金钱为唯一目的,而把信用和快乐生活视为第一追求的环境下,酿造出来的质优价廉的世界级美酒。...
野金筠菲: 有时我们不依赖于数据库中自动递增的字段产生唯一ID,比如多表同一字段需要统一一个唯一ID,这时就需要用程序来生成一个唯一的全局ID,然后在数据库事务中同时插入到多章表中实现同步. 在java中有个类工具很好的实现产生唯一ID(UUID)...
平山县13038881183: 简述java标识符的作用 - ?
野金筠菲: java标识符是用来给类、对象、方法、变量、接口和自定义数据类型命名的
平山县13038881183: java需要标识符是什么 - ?
野金筠菲: Java语言中,对于变量,常量,函数,语句块也有名字,我们统统称之为Java标识符. 标识符是用来给类、对象、方法、变量、接口和自定义数据类型命名的.如果你是声明一个方法应该是这样public void function(boolean hasFocus , int row , int column){ } public 是方法访问修饰符,void是返回的类型, function是方法的名称,括号里面是参数列表
平山县13038881183: 在java项目中生成log有什么作用 - ?
野金筠菲: 主要是项目运行阶段, 程序员不在现场 不能够看到当时出现的bug 所以把bug先以文档的形式存储在log文件中 . 方便排除错误
平山县13038881183: java中的标志符什么意思,求解释! - ?
野金筠菲: 标识符是用户编程时使用的名字.我们指定某个东西、人,都要用到它,他或她的名字;在数学中解方程时,我们也常常用到这样或那样的变量名或函数名.同样的道理,在电脑语言中,对于变量,常量,函数,语句块也有名字,我们统统称之为标识符.我们在给人起名字时有一定的规矩,比如,头一个字为父亲或母亲的姓氏,后面一般为一个或两个字.所以,也可以想当然地认为电脑语言里的标识符也有一定的命名规则.通俗的就是能改名字的都叫标识符,比如,public class Text,中的Text..还有public static void main (String[] args){...}中,args 就是标识符,还有int 什么什么那个名字可以改的都叫标识符
平山县13038881183: java语言标识符规则是什么? - ?
野金筠菲: Java标识符的命名规则: 1) 标识符由字母、数字、下划线“_”、美元符号“$”或者人民币符号“¥”组成,并且首字母不能是数字. 2) 不能把关键字和保留字作为标识符. 3) 标识符没有长度限制. 4) 标识符对大小写敏感.Java编程规范:1)类名和接口名:首字母大写,其余字母小写.如SamDoc 2)方法名和变量名:首字母小写,其余的字母大写. 如bothEyesOfDoll. 3)包名:字母全部小写.如,com.abc.dollapp. 4)常量名:采用大写形式,单词之间以下划线“_”隔开.
平山县13038881183: 有哪些合法的java标识符??😁 - ?
野金筠菲: 合法的java标识符的标识符很多. java标识符是以字母、下划线(…)或美元符($)开头,由字母、数字、下划线(一)或美元符($)组成的字符串.标识符区分大小写,长度没有限制.除以上所列几项之外,标识符中不能含有其他符号,当...
平山县13038881183: 为什么java中生成32位随机ID永远不会重复. - ?
野金筠菲: java对象的散列码hashcode,有32位,有40亿的空间. “永远不会重复”,没有说永远,好的散列函数在尽可能大的空间不重复. 个人认为. 1、可能重复,但重复后应该有处理机制.不担心重复. 2、在对象达到相当多的时候(比如10亿个),重复的几率才会变大.但实际使用上实时超过十万个对象的情况都不多.即很难重复.
平山县13038881183: java中的标示符指的是什么? - ?
野金筠菲: 标识符 在Java编程语言中,标识符是赋予变量、类或方法的名称.标识符可从一个字母、下划线(_)或美元符号($)开始,随后也可跟数字.标识符是大小写区别对待的并且未规定最大长度.有效标识符如下: - identifier - userName - User_name - _sys_varl - $change
平山县13038881183: 简述JAVA语言对于标识符定义有哪些要求? - ?
野金筠菲: JAVA语言对于标识符定义要求:Ⅰ.可以由字母,数字,”_”或者”$”符组成,但是不能以数字开头;Ⅱ.中文可以作为变量名,但是不提倡使用;Ⅲ.Java大小写敏感,严格区分大小写,命名时需要注意;Ⅳ.不能使用Java保留字(一些java语言规定好的,有特殊意义的字符如break,if等).