java uuid 和guid 的区别
发布时间:2025-05-23 16:32:38 发布人:远客网络
一、java uuid 和guid 的区别
全局唯一标识符(GUID)是一种算法生成的二进制长度为128位的数字标识符。它常用于拥有多个节点、多台计算机的网络或系统中,以确保在理想情况下,任何计算机和计算机集群都不会生成两个相同的GUID。GUID的总数达到了2^128(3.4×10^38)个,因此随机生成两个相同GUID的可能性非常小,但并不为0。为了减少这种重复的风险,用于生成GUID的算法通常都会加入非随机的参数,比如时间戳。
GUID这个词有时也专指微软对UUID标准的实现。UUID是由一组32位数的16进制数字组成的,理论上总数为16^32=2^128,约等于3.4 x 10^38。这意味着,即使每纳秒产生1兆个UUID,也需要大约100亿年才能用完所有的UUID。因此,GUID的唯一性非常高。
Java中的UUID与GUID相似,也是一种算法生成的128位数字标识符。Java的UUID类提供了多种方法来生成UUID,比如使用随机数生成器、基于时间戳等。与GUID一样,UUID的生成也依赖于非随机参数,以确保生成的UUID具有高度的唯一性。
在Java中,UUID可以用于各种场景,比如分布式系统中为对象分配全局唯一标识,或者在网络通信中作为消息标识符。通过使用非随机参数,Java UUID能够避免重复生成的问题,从而确保了其唯一性。
总结而言,Java UUID和GUID虽然都用于生成全局唯一标识符,但在实现细节上存在一些差异。GUID通常指微软实现的UUID标准,而Java UUID则是在Java平台上实现的UUID,两者都依赖于算法和非随机参数来确保唯一性。
二、Java加密和数字签名
1、 Java加密和数字签名本文主要谈一下密码学中的加密和数字签名以及其在java中如何进行使用对密码学有兴趣的伙伴推荐看 Bruce Schneier的著作 Applied Crypotography在jdk的发行版本中安全性方面有了很大的改进也提供了对RSA算法的直接支持现在我们从实例入手解决问题(本文仅是作为简单介绍)
2、这是一种与消息认证码结合使用以确保消息完整性的技术主要使用单向散列函数算法可用于检验消息的完整性和通过散列密码直接以文本形式保存等目前广泛使用的算法有MD MD SHA jdk对上面都提供了支持在java中进行消息摘要很简单 java security MessageDigest提供了一个简易的操作方法
3、/***MessageDigestExample java*Copyright*/ import java security MessageDigest;/***单一的消息摘要算法不使用密码可以用来对明文消息(如密码)隐藏保存*/ public class MessageDigestExample{ public static void main(String[] args) throws Exception{ if(args length!=){ System err println( Usage:java MessageDigestExample text); System exit();}
4、 byte[] plainText=args[ ] getBytes( UTF);
5、//使用getInstance(算法)来获得消息摘要这里使用SHA的位算法 MessageDigest messageDigest=MessageDigest getInstance( SHA);
6、 System out println( \n+messageDigest getProvider() getInfo());//开始使用算法 messageDigest update(plainText); System out println( \nDigest:);//输出算法运算结果 System out println(new String(messageDigest digest() UTF));}}还可以通过消息认证码来进行加密实现 javax crypto Mac提供了一个解决方案有兴趣者可以参考相关API文档本文只是简单介绍什么是摘要算法
7、这里补充另一个运用消息摘要的方式加密的例子: public class TestEncrypt{
8、/***@param strSrc:strSrc is a string will be encrypted*@param encName: encName is the algorithm name will be used* encName dafault to MD*@return String*/ public String Encrypt(String strSrc String encName){
9、 MessageDigest md= null; String strDes= null;
10、 byte[] bt= strSrc getBytes(); try{ if(encName== null|| encName equals()){ encName= MD;} md= MessageDigest getInstance(encName); md update(bt); strDes= bytes Hex(md digest());//to HexString} catch(NoSuchAlgorithmException e){ System out println( Invalid algorithm); return null;} return strDes;}
11、 public String bytes Hex(byte[] bts){ String des=; String tmp= null; for(int i=; i< bts length; i++){ tmp=(Integer toHexString(bts[i]& xFF)); if(tmp length()==){ des+=;} des+= tmp;} return des;}
12、 public static void main(String[]args){ TestEncrypt te= new TestEncrypt(); String strSrc=可以加密汉字 Oh and english; System out println( Source String:+ strSrc); System out println( Encrypted String:); System out println( Use Def:+ te Encrypt(strSrc null)); System out println( Use MD:+ te Encrypt(strSrc MD)); System out println( Use SHA:+ te Encrypt(strSrc SHA)); System out println( Use SHA:+ te Encrypt(strSrc SHA));}}
13、另外在javawebparts中的 RequestHelpers里的generateGUID方法也涉及到了MD的方法代码如下: public static String generateGUID(HttpServletRequest request){
14、 String out=; try{// Construct a string that is prised of:// Remote IP Address+ Host IP Address+ Date(yyyyMMdd)+// Time(hhmmssSSa)+ Requested Path+ Session ID+// HashCode Of ParameterMap StringBuffer***= new StringBuffer();*** append(request getRemoteAddr()); InetAddress ia= InetAddress getLocalHost();*** append(ia getHostAddress());*** append(new SimpleDateFormat( yyyyMMddhhmmssSSa) format(new Date())); String path= request getServletPath(); String pathInfo= request getPathInfo(); if(pathInfo!= null){ path+= pathInfo;}*** append(path);*** append(request getSession(false));*** append(request getParameterMap() hashCode()); String str=*** toString();// Now encode the string using an MD encryption algorithm MessageDigest md= MessageDigest getInstance( md); md update(str getBytes()); byte[] digest= md digest(); StringBuffer hexStr= new StringBuffer(); for(int i=; i< digest length; i++){ str= Integer toHexString( xFF& digest[i]); if(str length()<){ str=+ str;} hexStr append(str);} out= hexStr toString();} catch(NoSuchAlgorithmException nsae){ log error(nsae);} catch(UnknownHostException uhe){ log error(uhe);}// Return the encrypted string It should be unique based on the// ponents that prise the plain text string and should always be// characters thanks to the MD algorithm return out;
15、消息摘要只能检查消息的完整性但是单向的对明文消息并不能加密要加密明文的消息的话就要使用其他的算法要确保机密性我们需要使用私钥密码术来交换私有消息
16、这种最好理解使用对称算法比如 A用一个密钥对一个文件加密而B读取这个文件的话则需要和A一样的密钥双方共享一个私钥(而在web环境下私钥在传递时容易被侦听)
17、使用私钥加密的话首先需要一个密钥可用javax crypto KeyGenerator产生一个密钥(java security Key)然后传递给一个加密工具(javax crypto Cipher)该工具再使用相应的算法来进行加密主要对称算法有 DES(实际密钥只用到位) AES(支持三种密钥长度位)通常首先位其他的还有DESede等 jdk种也提供了对对称算法的支持以下例子使用AES算法来加密
18、/***PrivateExmaple java*Copyright*/ import javax crypto Cipher; import javax crypto KeyGenerator; import java security Key;
19、/***私鈅加密保证消息机密性*/ public class PrivateExample{ public static void main(String[] args) throws Exception{ if(args length!=){ System err println( Usage:java PrivateExample<text>); System exit();} byte[] plainText=args[ ] getBytes( UTF);
20、//通过KeyGenerator形成一个key System out println( \nStart generate AES key); KeyGenerator keyGen=KeyGenerator getInstance( AES); keyGen init(); Key key=keyGen generateKey(); System out println( Finish generating DES key);
21、//获得一个私鈅加密类Cipher ECB是加密方式 PKCS Padding是填充方法 Cipher cipher=Cipher getInstance( AES/ECB/PKCS Padding); System out println( \n+cipher getProvider() getInfo());
22、//使用私鈅加密 System out println( \nStart encryption:); cipher init(Cipher ENCRYPT_MODE key); byte[] cipherText=cipher doFinal(plainText); System out println( Finish encryption:); System out println(new String(cipherText UTF));
23、 System out println( \nStart decryption:); cipher init(Cipher DECRYPT_MODE key); byte[] newPlainText=cipher doFinal(cipherText); System out println( Finish decryption:);
24、 System out println(new String(newPlainText UTF));
25、上面提到私钥加密需要一个共享的密钥那么如何传递密钥呢?web环境下直接传递的话很容易被侦听到幸好有了公钥加密的出现公钥加密也叫不对称加密不对称算法使用一对密钥对一个公钥一个私钥使用公钥加密的数据只有私钥能解开(可用于加密)同时使用私钥加密的数据只有公钥能解开(签名)但是速度很慢(比私钥加密慢到倍)公钥的主要算法有RSA还包括Blowfish Diffie Helman等 jdk种提供了对RSA的支持是一个改进的地方
26、/***PublicExample java*Copyright*/ import java security Key; import javax crypto Cipher; import java security KeyPairGenerator; import java security KeyPair;/***一个简单的公鈅加密例子 Cipher类使用KeyPairGenerator生成的公鈅和私鈅*/ public class PublicExample{ public static void main(String[] args) throws Exception{ if(args length!=){ System err println( Usage:java PublicExample<text>); System exit();}
27、 byte[] plainText=args[ ] getBytes( UTF);//构成一个RSA密钥 System out println( \nStart generating RSA key); KeyPairGenerator keyGen=KeyPairGenerator getInstance( RSA); keyGen initialize(); KeyPair key=keyGen generateKeyPair(); System out println( Finish generating RSA key);
28、//获得一个RSA的Cipher类使用公鈅加密 Cipher cipher=Cipher getInstance( RSA/ECB/PKCS Padding); System out println( \n+cipher getProvider() getInfo());
29、 System out println( \nStart encryption); cipher init(Cipher ENCRYPT_MODE key getPublic()); byte[] cipherText=cipher doFinal(plainText); System out println( Finish encryption:); System out println(new String(cipherText UTF));
三、javauuid至少截取多少位能保持唯一
1、UUID使用16位足以保证唯一性,对于大型项目,考虑使用32位或64位,尽管如此,集群和高并发环境下仍可能产生重复。在分布式系统中,GUID的性能表现也较好。
2、雪花算法是一个常用的生成唯一ID的算法,其在性能上表现出色,适用于各种分布式环境。对于可能出现的时间回拨问题,网上有多种解决方案,例如百度提供的一款开源分布式系统雪花算法,它完美解决了时钟回拨问题。