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
一堣而安
閱讀(570)
評論(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緩慢 問題解決(49149)
2.?myeclipse 8.5最新注冊碼(過期時間到2016年)(39211)
3.?java.lang.NoClassDefFoundError: Could not initialize class 的原因(30096)
4.?java.net.SocketException: Connection reset 解決方法(14997)
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 © 一堣而安
主站蜘蛛池模板:
名山县
|
八宿县
|
大宁县
|
四川省
|
迭部县
|
习水县
|
蓬安县
|
胶州市
|
林口县
|
额尔古纳市
|
长丰县
|
丰都县
|
贡觉县
|
盐山县
|
九龙城区
|
南京市
|
江城
|
滦平县
|
通榆县
|
津南区
|
印江
|
通化市
|
呼和浩特市
|
玉环县
|
拉孜县
|
民乐县
|
新竹市
|
苗栗县
|
长垣县
|
肇东市
|
彩票
|
安庆市
|
洪雅县
|
新宾
|
霸州市
|
长宁区
|
新乡县
|
宁化县
|
临桂县
|
九龙坡区
|
广南县
|