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
一堣而安
閱讀(569)
評論(0)
編輯
收藏
所屬分類:
java
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發表評論。
網站導航:
博客園
IT新聞
Chat2DB
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緩慢 問題解決(49148)
2.?myeclipse 8.5最新注冊碼(過期時間到2016年)(39210)
3.?java.lang.NoClassDefFoundError: Could not initialize class 的原因(30095)
4.?java.net.SocketException: Connection reset 解決方法(14996)
5.?手機號碼和電話號碼的正則表達式(14958)
評論排行榜
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 © 一堣而安
主站蜘蛛池模板:
伊春市
|
鄂托克旗
|
贵溪市
|
乌兰察布市
|
昆山市
|
盘锦市
|
琼结县
|
同心县
|
瑞安市
|
南城县
|
靖边县
|
乌苏市
|
永泰县
|
横峰县
|
嘉善县
|
绍兴县
|
商都县
|
威海市
|
梁平县
|
政和县
|
扶绥县
|
金阳县
|
黑水县
|
通许县
|
安福县
|
苏尼特左旗
|
台南县
|
大方县
|
阿拉善左旗
|
威海市
|
景泰县
|
乐至县
|
肥乡县
|
嘉荫县
|
昭觉县
|
嘉黎县
|
衡水市
|
洪湖市
|
洪雅县
|
昌黎县
|
桓台县
|