tinguo002
java生成uuid(转载)
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();
}
}
}
欢迎大家访问我的个人网站
萌萌的IT人
posted on 2014-04-16 09:07
一堣而安
阅读(558)
评论(0)
编辑
收藏
所属分类:
java
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
知识库
C++博客
博问
管理
相关文章:
Linux 下配置 JDK 环境变量
图片转字符串
java中InputStream转化为byte[]数组
tomcat虚拟目录配置
Tomcat的窗口名称修改
java下载网页内容和网络图片
redis使用
java request 获取域名
JAVA反射机制,把JavaBean属性转成字符串
Java String转Float精度不准确问题
导航
BlogJava
首页
新随笔
联系
聚合
管理
统计
随笔 - 165
文章 - 0
评论 - 38
引用 - 0
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(1)
给我留言
查看公开留言
查看私人留言
随笔分类
amchart(1)
(rss)
hibernate
(rss)
java(43)
(rss)
js_css(59)
(rss)
Linux(11)
(rss)
myeclipse(6)
(rss)
oracle(22)
(rss)
sql(5)
(rss)
struts2(3)
(rss)
tomcat(4)
(rss)
web开发协作工具(7)
(rss)
日志(1)
(rss)
测试(1)
(rss)
环境部署(1)
(rss)
软件工程(3)
(rss)
随笔档案
2015年3月 (1)
2014年10月 (1)
2014年8月 (8)
2014年7月 (19)
2014年6月 (4)
2014年5月 (10)
2014年4月 (12)
2014年3月 (2)
2014年2月 (5)
2014年1月 (2)
2013年12月 (12)
2013年11月 (6)
2013年10月 (5)
2013年9月 (2)
2013年7月 (3)
2013年6月 (5)
2013年5月 (4)
2013年4月 (9)
2013年3月 (10)
2013年2月 (3)
2013年1月 (5)
2012年12月 (4)
2012年11月 (8)
2012年9月 (3)
2012年8月 (5)
2012年7月 (10)
2012年6月 (2)
2012年3月 (2)
2012年2月 (1)
2011年11月 (1)
收藏夹
Amchart(4)
(rss)
iReport(2)
(rss)
oracle(2)
(rss)
servlet
(rss)
Tomcat(1)
(rss)
树形(2)
(rss)
搜索
最新评论
1. 31313
31321313
--31231
2. re: myeclipse 8.5最新注册码(过期时间到2016年)
怎么申请注册码
--Ftitd
3. re: myeclipse 8.5最新注册码(过期时间到2016年)
感谢楼主呀,非常感谢
--it码畜
4. re: myeclipse 8.5最新注册码(过期时间到2016年)
可用,多谢!
--liv17
5. re: myeclipse 8.5最新注册码(过期时间到2016年)
感谢!好用!
--yu
阅读排行榜
1. myeclipse开启后卡死、building workspace缓慢 问题解决(49085)
2. myeclipse 8.5最新注册码(过期时间到2016年)(39198)
3. java.lang.NoClassDefFoundError: Could not initialize class 的原因(30012)
4. 手机号码和电话号码的正则表达式(14950)
5. java.net.SocketException: Connection reset 解决方法(13869)
评论排行榜
1. myeclipse 8.5最新注册码(过期时间到2016年)(33)
2. LoadRunner11安装过程中遇到的问题及解决(4)
3. linux tomcat启动过程记录(1)
4. jQuery.validate 中文API (1)
5. racle 在Drop表时的Cascade Constraints(0)
Powered by:
BlogJava
Copyright © 一堣而安