您当前的位置:首页 > 互联网教程

java生成唯一标识符有什么用

发布时间:2025-05-25 05:47:06    发布人:远客网络

java生成唯一标识符有什么用

一、java生成唯一标识符有什么用

有时我们不依赖于数据库中自动递增的字段产生唯一ID,比如多表同一字段需要统一一个唯一ID,这时就需要用程序来生成一个唯一的全局ID,然后在数据库事务中同时插入到多章表中实现同步.

在java中有个类工具很好的实现产生唯一ID(UUID),但是由数字和字母及中划线组成的,故数据库字段应该设置为char并相应的建立索引.

UUID是128位整数(16字节)的全局唯一标识符(Universally Unique Identifier).

指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的.通常平台会提供生成UUID的API.UUID按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址,纳秒级时间,芯片ID码和许多可能的数字.由以下几部分的组合:当前日期和时间(UUID的第一个部分与时间有关,如果你在生成一个 UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同),时钟序列,全局唯一的IEEE机器识别号(如果有网卡,从网卡获得,没有网卡以其他方式获得),UUID的唯一缺陷在于生成的结果串会比较长.关于UUID这个标准使用最普遍的是微软的GUID(Globals Unique Identifiers).

在ColdFusion中可以用CreateUUID()函数很简单的生成UUID,其格式为:xxxxxxxx- xxxx-xxxx-xxxxxxxxxxxxxxxx(8-4-4-16),其中每个 x是 0-9或 a-f范围内的一个十六进制的数字.而标准的UUID格式为:xxxxxxxx-xxxx-xxxx-xxxxxx-xxxxxxxxxx(8-4-4-4-12)

,可以从cflib下载CreateGUID() UDF进行转换.

使用UUID的好处在分布式的软件系统中(比如:DCE/RPC, COM+,CORBA)就能体现出来,它能保证每个节点所生成的标识都不会重复,并且随着WEB服务等整合技术的发展,UUID的优势将更加明显.

关于UUID的更多信息可以多google一下.

UUID(Universally Unique Identifier)全局唯一标识符,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的.按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址,纳秒级时间,芯片ID码和许多可能的数字.由以下几部分的组合:当前日期和时间(UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同),时钟序列,全局唯一的IEEE机器识别号(如果有网卡,从网卡获得,没有网卡以其他方式获得),UUID的唯一缺陷在于生成的结果串会比较长.

在Java中生成UUID主要有以下几种方式:

如果使用的JDK1.5的话,那么生成UUID变成了一件简单的事,以为JDK实现了UUID:

String s= UUID.randomUUID().toString();//用来生成数据库的主键id非常不错..

package com.taobao.tddl.client.util;

import java.io.UnsupportedEncodingException;

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

import java.security.SecureRandom;

import java.util.concurrent.atomic.AtomicLong;

import java.util.concurrent.locks.ReentrantLock;

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>(

for(int i= 0; i< digits.length;++i){

private static UniqId me= new UniqId();

private Random random= new SecureRandom();

private MessageDigest mHasher;

private UniqTimer timer= new UniqTimer();

private ReentrantLock opLock= new ReentrantLock();

InetAddress addr= InetAddress.getLocalHost();

hostAddr= addr.getHostAddress();

hostAddr= String.valueOf(System.currentTimeMillis());

if(hostAddr== null|| hostAddr.length()== 0

||"127.0.0.1".equals(hostAddr)){

hostAddr= String.valueOf(System.currentTimeMillis());

mHasher= MessageDigest.getInstance("MD5");

} catch(NoSuchAlgorithmException nex){

public static UniqId getInstance(){

return timer.getCurrentTime();

*@return uniqTime-randomNum-hostAddr-threadId

StringBuffer sb= new StringBuffer();

long t= timer.getCurrentTime();

sb.append(random.nextInt(8999)+ 1000);

sb.append(Thread.currentThread().hashCode());

public String getUniqIDHashString(){

return hashString(getUniqID());

public byte[] getUniqIDHash(){

public byte[] hash(String str){

byte[] bt= mHasher.digest(str.getBytes("UTF-8"));

if(null== bt|| bt.length!= 16){

throw new IllegalArgumentException("md5 need");

} catch(UnsupportedEncodingException e){

throw new RuntimeException("unsupported utf-8 encoding", e);

public byte[] hash(byte[] data){

byte[] bt= mHasher.digest(data);

if(null== bt|| bt.length!= 16){

throw new IllegalArgumentException("md5 need");

public String hashString(String str){

public String hashBytes(byte[] str){

*将一个字节数组转化为可见的字符串

public String bytes2string(byte[] bt){

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]];

public byte[] string2bytes(String str){

throw new NullPointerException("参数不能为空");

throw new IllegalArgumentException("字符串长度必须是32");

char[] chs= str.toCharArray();

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));

private static class UniqTimer{

private AtomicLong lastTime= new AtomicLong(System.currentTimeMillis());

public long getCurrentTime(){

return this.lastTime.incrementAndGet();

二、java字符串缩短还原

用java如何实现压缩字符串?

首先你这不是物理上的压缩,也就是说它是一个逻辑上的我们认同上的压缩。你需要写一个算法来对你所要处理的数据进行统计,然后按照算法来改变结果。最后达到一个后台的虚拟压缩(实际上不是压缩,只是算法)。

首先你这不是物理上的压缩,也就是说它是一个逻辑上的我们认同上的压缩。你需要写一个算法来对你所要处理的数据进行统计,然后按照算法来改变结果。最后达到一个后台的虚拟压缩(实际上不是压缩,只是算法)。

Deflater是同时使用了LZ77算法与哈夫曼编码的一个无损数据压缩算法。

JAVA有一个publicString(bytebytes[],Charsetcharset)函数可以用指定字节数组和编码来构造字符串。一个publicbyte[]getBytes(Charsetcharset)函数把字符串按指定编码来得到字节数组。可以用这两个函数来实现编码转换。

——分割线JDK本身提供了数据压缩的一个APIjava.util.zip.Deflater.deflateBytes(byte[]b,intoff,intlen)以下是我使用的一个例子,有点多,注释看不懂可以问我,不知道怎么用可以问我,其他的就算了。

在java中用Inflater.setInput()输入PHP传来的码文,用Inflater.inflate()解压出原文.再用newString(原文,GBK);转换成java字符串。

没做过压缩程序,JAVA里面的字符串使用的编码为unicode,ZIP文件里面用的应该是本地编码(中文操作系统用的是GB2312)。你可以尝试着用类似这样的语句:Stringstr=(otherStr.getBytes(GB2312));祝好运。

java中MessageDigest加密之后怎么还原出原字符串

1、摘要算法不能算是加密算法,是不可逆的,所以用MessageDigest计算出的摘要值无法还原出原字符串,这是理论上决定的。

1、摘要算法不能算是加密算法,是不可逆的,所以用MessageDigest计算出的摘要值无法还原出原字符串,这是理论上决定的。

2、既然用UTF8你在Java代码中也转成UTF8啊。

3、如果java移位加密算法中包含了空格,可以先将空格替换或者删除,然后再进行加密操作。若删除空格后,字符串长度不能被加密位数整除,可以在字符串末尾补0,使得其长度能够被整除。

4、ZΜmq这个很正常。加密是将字节按照一定的规则进行了转换,转换后出什么样的怪字符都是正常的。一般的做法是将加密后的byte数组转换为十六进制的字符串。

5、今天,我们就一起来了解一下,这些信息加密的方法是如何运行的。它背后的原理都有哪些。希望通过对本文的阅读。能够提高大家对互联网信息安全的信任度。

如果是16进制编码,你可以转换成为64进制或者更高,节省的就多了。键盘上大概有90~100个字符,你可以搞到90进制。

可以用基本数据类型的对象包装器来转换。这在lang包中,系统自动加载。

既然是将一个无限大的字符串转变成一个整型,那么这个字符串肯定是由数字组成的字符串。在Java中如果一个数字大到不能再大的时候就可以考虑使用大数操作了。

忽略转义的工具类,org.apache.commons.lang.StringEscapeUtils,其中unescapeJava(Strings)方法是来处理java转义字符的,可以将字符串中的“\”转换为“\”,“”转换为“”等。

XML实体中不允许出现&,等特殊字符,否则XML语法检查时将出错,如果编写的XML文件必须包含这些字符,则必须分别写成&,再写入文件中。

assertEquals(ESCAPED_XML,escapedXML.toString());}总体思路就是遇到特殊字符,如,用来替换就可以了。

一般的特殊字符都是需要转义的,请参阅xml特殊字符如何转义。

一般来讲用这个即可![CDATA[内容]],如果不行可以用&代替&。注意分号不能省哟。

一般,我们要求上游传xml格式字符串时直接给转义好,或者允许含特殊字符的节点增加CDATA包围,但是总有那么一些管杀不管埋的伙伴,你能不能解析是你的事。

三、java /groovy 的MD5类 及怎么使用

1、在Java或Groovy中生成字符串的MD5值是一个常见的任务。以Java为例,可以使用MessageDigest类来实现。首先,定义一个待处理的字符串,例如:

2、String dst="一个待生成md5值的字符串";

3、然后,获取MD5算法的MessageDigest实例:

4、MessageDigest md= MessageDigest.getInstance("MD5");

5、接下来,将字符串转换为字节数组,并使用update方法将字节数组传给MessageDigest实例:

6、为了将生成的二进制数组转换为十六进制字符串,可以使用StringBuffer:

7、StringBuffer sb= new StringBuffer(); for(byte b: digest){ sb.append(String.format("%02x", b& 0xff));}

8、最后,打印原始字符串和对应的MD5值:

9、System.out.println("原值:"+ dst); System.out.println("MD5:"+ sb);

10、以上代码展示了如何在Java中生成字符串的MD5值。类似地,在Groovy中也可以使用相似的方法来实现。通过这种方法,可以轻松地将字符串转换为MD5格式,适用于数据完整性校验等多种场景。

11、在实际应用中,可能需要处理不同长度的字符串,确保生成的MD5值始终为固定的长度。此外,还可以考虑使用第三方库来简化MD5值的生成过程,如Apache Commons Codec等,这些库提供了更为简便的接口来处理MD5。

12、需要注意的是,在处理大量数据时,应当关注性能和资源消耗。确保代码的高效运行,避免不必要的性能瓶颈。

13、总结来说,生成字符串的MD5值是通过MessageDigest类来实现的,涉及到字节数组的转换、十六进制字符串的生成,以及最终的MD5值打印。这种技术在多种应用场景中都非常有用,包括但不限于数据加密、文件完整性校验等。