171207之UUID用法

来源:互联网 发布:龙岗网络推广 编辑:程序博客网 时间:2024/05/23 20:52

简介:
UUID是jdk1.5中新增的一个类,在java.util下,用它可以产生一个号称全球唯一的ID. UUID是由一个十六位的数字组成,表现出来的形式例如:
550E8400-E29B-11D4-A716-446655440000

UUID由以下几部分的组合:
(1)当前日期和时间,UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同。
(2)时钟序列。
(3)全局唯一的IEEE机器识别号,如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得。
UUID的唯一缺陷在于生成的结果串会比较长。

问题:
UUID不是128位长的吗,怎么生成的都是36个字符的字符串?
UUID.fromString(“84D1319C-FBAF-644C-901A-8F091F25AF04”));
UUID中有固定的四个 ”-“,所以32位长。
128位是 二进制, 每四个二进制转一个16进制数。 128/4=32
所以,就是32个16进制数的字符了。

下面是java代码生成uuid的例子(这个就比时间戳或者是随机数更加专业和靠谱了)

import java.util.UUID;  public static String getUUID() {           UUID uuid =UUID.randomUUID();           String str = uuid.toString();          // 去掉"-"符号           String temp = str.substring(0, 8) +str.substring(9, 13) + str.substring(14, 18) + str.substring(19, 23) +str.substring(24);           return  str+","+temp;       }   

1:UUID在MySQL中的用法
建表

DROP TABLE IF EXISTS `test2`;CREATE TABLE `test2` (  `Id` varchar(80) NOT NULL default '',  `name` varchar(20) default NULL,  PRIMARY KEY  (`Id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;

select uuid();
直接select出来 24a4cb47-bcc3-1031-9f87-af69febdbb6e

insert into test2(id,name) values(uuid(),’22’);
自动生成uuid插入数据库作为主键。

select replace(uuid(),’-‘,”);
替换uuid中的“-”为“”;

在使用Oracle的时候,需要添加一个唯一的主键,一般使用的是36位的唯一的字符串,我们有两种方式
一、使用数据库自动生成的方式,自动添加唯一的ID值

create table t_log(    ssid varchar2(36) default sys_guid() primary key,    type varchar2(10),    detail varchar2(100));

default sys_guid()这个函数时Oracle自带的,在插入数据的时候不用插入该字段就会自动生成。

1、SYS_GUID:获取的是 数据库中唯一的主键
2、SYSDATE:获取的是 插入数据时 的时间

insert into t_log(type,detail)values(‘1’,’测试无主键’);

二、使用JAVA自动生成的UUID,作为数据库字段的主键

public class TestUUID {    public static void main(String[] args) {        String uuid = UUID.randomUUID().toString();        System.out.println(uuid.length());        System.out.println(uuid.replace("-", ""));        int num = str2Num("10000");        System.out.println(num);        String date = transferToFormat("huangbia");        System.out.println(date);        String nowDate = getCurrentDateStr(SDF_YYYY_MM_DD_HH_MM_SS_SS);        System.out.println(nowDate);    }/**     * 字符串转为数字,截取前面的0     * @param str     * @return     */    public static int str2Num(String str){        char[] array = str.toCharArray();        System.out.println(array);        System.out.println(array.length);        for(int i = 0; i < array.length; i++){            System.out.println(array[i]);            if(array[i] != '0'){                str = str.substring(i);                break;            }        }        return Integer.parseInt(str);    }    /**     * 将字符串转换成2010-12-21格式的     * @param propName     * @return     */    public static String transferToFormat(String trDate)    {        StringBuffer busiDate = new StringBuffer();        busiDate.append(trDate.substring(0, 4));        busiDate.append("-");        busiDate.append(trDate.substring(4, 6));        busiDate.append("-");        busiDate.append(trDate.substring(6, 8));        return busiDate.toString();    }       /**     * SDF_YYYY_MM_DD_HH_MM_SS_SS格式     */    public static final SimpleDateFormat SDF_YYYY_MM_DD_HH_MM_SS_SS = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SS");     /**     * 获取当前日期的字符串形式     * @param sdf 格式化器     * @return     */    public static String getCurrentDateStr(SimpleDateFormat sdf){        return sdf.format(new Date());    }}

关于如何使用工具类?
对于定义属性(常用的变量)名称需要使用大写,使用的是static类型,这样就可以作为工具一样的去使用,例如工程的常用字符串、公共方法(跟业务没有什么关系)——例如得到系统时间,得到用户信息等等

参考博客:http://m.blog.csdn.net/hbiao68/article/details/17112983

原创粉丝点击