在开发系统时,我经常需要通过程序自动生成一个字符串类型的唯一ID,比如:商品编号,学生编号,银行卡账号等等。并且在分户式环境或者将来系统迁移后也要保证其标识符的唯一性。那么有什么比较好的方法解决这一问题呢?于是jdk1.5以后出了UUID这个类来生成唯一的字符串标识。
1.什么是UUID
UUID含义是通用唯一识别码 (Universally Unique Identifier),这是一个软件建构的标准,也是被开源软件基金会 (Open Software Foundation, OSF) 的组织应用在分布式计算环境 (Distributed Computing Environment, DCE) 领域的重要部分。
UUID 的目的是让分布式系统中的所有元素,都能有唯一的标识符,而不需要透过中央控制端来做辨识指定。这样每个人都可以建立不与其它人冲突的 UUID。在这样的情况下,就不需考虑数据库建立时的名称重复问题。
2.UUID的组成
UUID由以下几部分的组合:
1).当前日期和时间,UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同。
2).时钟序列。
3).全局唯一的IEEE机器识别号,如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得。
3.生成UUID
实例:
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
public class UUIDDemo {
//得到32位的uuid字符串
public static String getUUID32(){
return UUID.randomUUID().toString().replace("-", "").toLowerCase();
}
//得到指定数量的UUID,以数组的形式返回
public static String[] getUUID(int num){
if( num <= 0)
return null;
String[] uuidArr = new String[num];
for (int i = 0; i < uuidArr.length; i++) {
uuidArr[i] = getUUID32();
}
return uuidArr;
}
public static void main(String[] args) {
System.out.println("-------------得到32位的uuid字符串------------");
System.out.println(getUUID32());
System.out.println("----------得到指定数量的UUID,以数组的形式返回--------");
String[] ids = getUUID(10);
List<String> list = Arrays.asList(ids);
list.forEach(System.out::println);
}
}
运行结果: -------------得到32位的uuid字符串------------ d79db07a885f4bae895f3791412274b0 ----------得到指定数量的UUID,以数组的形式返回-------- d0bf8e28ea6d429fa7ea24b403d4ac4f 836e53b32d5148e9b3023494156452eb 49d3cd05653a44c28dd762e19841228a 384b86d95111467386f86029a9d3ceac b1ec93df1ab6409c9d16501c1ed2e702 e832ac479da34a768585e0f0b1870465 7463d386a2b0419daa2a3977647bd7cd cb7a6609f66c4aa8b7454ee6a83efb71 e849635aa88c4e2e81a820e0fffe63e0 99f5f0edb9d941bfa77acf4cfd307598