本问题已经有最佳答案,请猛点这里访问。

我正在寻找在Java中创建唯一ID作为String的最佳方法。

任何指导表示赞赏,谢谢。

我应该提到我正在使用Java 5。

看看这个stackoverflow.com/a/9176060/1737819。

创建一个UUID。

String uniqueID = UUID.randomUUID().toString();

它不是人类可读的全部...

@pjp:真正随机生成的ID通常不可读。并且使其可读性通常会使其更长,从而使可读性降低。

我不知道他想要一个人类可读的唯一ID ...这会大大增加难度

另一个注意事项-如果您只需要应用程序唯一性,而AtomicInteger(如Michael Borgwardt所述)是更好的选择,但是如果您需要全局唯一性,那么UUID是一个更好的选择。

谢谢,这是我现在所需要的,尽管Adamskis的回答也非常好,将来我可能还需要更多类似的东西。

为什么不能使用System.currentTimeMillis生成单调递增的序列并添加一些随机的正整数盐?

您当然可以@Farhad,但是UUID是唯一保证跨大流量的多台服务器唯一性的方法。

如果您需要简短的,人类可读的ID,并且每次JVM运行仅需要它们是唯一的:

private static long idCounter = 0;

public static synchronized String createID()

{

return String.valueOf(idCounter++);

}

编辑:注释中建议的替代方案-这依赖于引擎盖下的"魔术"来确保线程安全,但具有更高的可伸缩性和安全性:

private static AtomicLong idCounter = new AtomicLong();

public static String createID()

{

return String.valueOf(idCounter.getAndIncrement());

}

我更喜欢Michaels方法而不是UUID方法,因为在调试时顺序ID通常更有用/更容易。同样,也不保证UUID.randomUUID()100%返回唯一值。

@Adamski:只要您不重新启动JVM,仅运行1个JVM并且计数器没有溢出,则此方法将仅创建唯一值。所有这些假设很容易被打破。在这种情况下,UUID.randomUUID()实际上更可靠。

虽然不是100%保证的,但您与任何人发生碰撞的几率很低(因为整个空间大于估计存在于宇宙中的原子数),因此可以保证100%保证。而且,如果您需要全局唯一性,那么这是实现此目标的最简单方法。但是,如果您只需要局部唯一性(即当前现有应用程序的唯一性),那么AtomicInteger绝对是可行的方法。

java.util.UUID:toString()方法

这是我的两分钱:我以前实现了一个IdFactory类,该类以[主机名]-[应用程序开始时间]-[当前时间]-[标识符]的格式创建ID。这在很大程度上保证了ID在JVM实例之间是唯一的,同时保持ID的可读性(尽管相当长)。这是代码,以防万一:

public class IdFactoryImpl implements IdFactory {

private final String hostName;

private final long creationTimeMillis;

private long lastTimeMillis;

private long discriminator;

public IdFactoryImpl() throws UnknownHostException {

this.hostName = InetAddress.getLocalHost().getHostAddress();

this.creationTimeMillis = System.currentTimeMillis();

this.lastTimeMillis = creationTimeMillis;

}

public synchronized Serializable createId() {

String id;

long now = System.currentTimeMillis();

if (now == lastTimeMillis) {

++discriminator;

} else {

discriminator = 0;

}

// creationTimeMillis used to prevent multiple instances of the JVM

// running on the same host returning clashing IDs.

// The only way a clash could occur is if the applications started at

// exactly the same time.

id = String.format("%s-%d-%d-%d", hostName, creationTimeMillis, now, discriminator);

lastTimeMillis = now;

return id;

}

public static void main(String[] args) throws UnknownHostException {

IdFactory fact = new IdFactoryImpl();

for (int i=0; i<1000; ++i) {

System.err.println(fact.createId());

}

}

}

这会给UUID生成增加更多的随机性,但要确保每个生成的ID的长度相同

import org.apache.commons.codec.digest.DigestUtils;

import java.util.UUID;

public String createSalt() {

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

String rand = UUID.randomUUID().toString();

return DigestUtils.sha1Hex(ts + rand);

}

我喜欢额外的currentTimeMillis,它确实使它变得随机。

UUID.randomUUID()已使用"加密强度高"的随机数生成器生成了ID。增加更多随机性是什么意思?您可以根据时间间隔随机添加盐来获得什么?

如果我没记错的话UUID.randomUUID()在创建随机ID时已经使用了时间因子。

恕我直言,阿珀金斯提供了一种优雅的解决方案,因为它是本机的,并且使用的代码更少。

但是,如果您需要较短的ID,则可以使用以下方法来减少生成的String长度:

// usage: GenerateShortUUID.next();

import java.util.UUID;

public class GenerateShortUUID() {

private GenerateShortUUID() { } // singleton

public static String next() {

UUID u = UUID.randomUUID();

return toIDString(u.getMostSignificantBits()) + toIDString(u.getLeastSignificantBits());

}

private static String toIDString(long i) {

char[] buf = new char[32];

int z = 64; // 1 << 6;

int cp = 32;

long b = z - 1;

do {

buf[--cp] = DIGITS66[(int)(i & b)];

i >>>= 6;

} while (i != 0);

return new String(buf, cp, (32-cp));

}

// array de 64+2 digitos

private final static char[] DIGITS66 = {

'0','1','2','3','4','5','6','7','8','9',        'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',

'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',

'-','.','_','~'

};

}

Java –生成唯一ID

UUID是用Java生成唯一ID的最快,最简单的方法。

import java.util.UUID;

public class UniqueIDTest {

public static void main(String[] args) {

UUID uniqueKey = UUID.randomUUID();

System.out.println (uniqueKey);

}

}

我们可以使用UUID在Java中创建唯一ID,然后在UUID上调用类似randomUUID()的方法。

String uniqueID = UUID.randomUUID().toString();

这将生成随机的uniqueID,其返回类型将为String。

具有计数信息的唯一ID

import java.util.concurrent.atomic.AtomicLong;

public class RandomIdUtils {

private static AtomicLong atomicCounter = new AtomicLong();

public static String createId() {

String currentCounter = String.valueOf(atomicCounter.getAndIncrement());

String uniqueId = UUID.randomUUID().toString();

return uniqueId +"-" + currentCounter;

}

}

在Java中有三种生成唯一ID的方法。

1)UUID类提供了一种生成唯一ID的简单方法。

UUID id = UUID.randomUUID();

System.out.println(id);

2)SecureRandom和MessageDigest

//initialization of the application

SecureRandom prng = SecureRandom.getInstance("SHA1PRNG");

//generate a random number

String randomNum = new Integer(prng.nextInt()).toString();

//get its digest

MessageDigest sha = MessageDigest.getInstance("SHA-1");

byte[] result =  sha.digest(randomNum.getBytes());

System.out.println("Random number:" + randomNum);

System.out.println("Message digest:" + new String(result));

3)使用java.rmi.server.UID

UID userId = new UID();

System.out.println("userId:" + userId);

String name,password;

public int idGen() {

int id = this.name.hashCode() + this.password.hashCode();

int length = String.valueOf(id).length();

int Max_Length = 5;

if(String.valueOf(id).length()>Max_Length)

{

id = (int) (id /Math.pow(10.0,length - Max_Length ));

}

return  id;

}

enter code here

生成唯一ID的程序

class Test {

public static void main(String arg[]) {

String s ="";

double d;

for (int i = 1; i <= 16; i++) {

d = Math.random() * 10;

s = s + ((int)d);

if (i % 4 == 0 && i != 16) {

s = s +"-";

}

}

System.out.println(s);

}

}

输出:

7954-7605-1827-4795

1991-4912-4912-3008

请至少添加几行,以说明您在做什么以及它为什么起作用。

问题不仅仅在于随机字符串,还在于唯一字符串。

此代码如何确保不重复唯一ID?重复唯一ID的机会是什么?

java creat uid_关于uniqueidentifier:如何在Java中创建唯一ID?相关推荐

  1. hive 元数据 自定义_如何在Hive中创建自定义函数UDF及如何直接通过Impala的同步元数据重用UDF的jar文件-阿里云开发者社区...

    如何在Hive中创建自定义函数UDF及使用 如何在Impala中使用Hive的自定义函数 UDF函数开发 使用Intellij工具开发Hive的UDF函数,进行编译: 1.使用Intellij工具通过 ...

  2. 如何在IDEA中创建web项目并且部署到Tomcat中

    如何在IDEA中创建web项目并且部署到Tomcat中 步骤1:File->New Project, 步骤2:选择Project SDK为1.7 -> Next -> Finish( ...

  3. 如何在 IDEA 中创建并部署 JavaWeb 程序

    前言 在之前 Java 的学习中,我们可能更多地是和控制台程序打交道,也就是我们日常说的黑框框程序. 现在既然完成了 Java SE 部分的基础知识,是时候来学习 JavaWeb 部分.而随着 IDE ...

  4. matlab 对话框保持,如何在matlab中创建输入对话框?(How to create Input dialog box in matlab?)...

    如何在matlab中创建输入对话框?(How to create Input dialog box in matlab?) 我想在matlab中创建输入对话框. 我在MATLAB中执行简单的加法运算. ...

  5. jenkins中maven的安装及配置,如何在jenkins中创建maven任务。

    本文介绍了在jenkins中maven的安装及配置(安装maven及jdk的方法),以及如何在jenkins中创建maven任务. 有三点需要注意的地方. maven一定要安装在jenkins服务器上 ...

  6. 如何在idea中创建一个SpringBoot项目(超详细教学)

    如何在idea中创建一个SpringBoot项目 目录 环境准备 1.1打开IDEA,点击New新建一个项目 1.2 使用Spring Initializr方式构建Spring Boot项目 1.3 ...

  7. 如何在Leangoo中创建企业

    Leangoo介绍: Leangoo(中文名:领歌)是一款非常优秀的敏捷项目管理软件.Leangoo核心是看板,团队可以使用Leangoo看板进行项目或产品的需求.任务.问题.缺陷的可视化管理和协作, ...

  8. 如何在android中创建自定义对话框?

    本文翻译自:How to create a Custom Dialog box in android? I want to create a custom dialog box like below ...

  9. html树状图右侧_如何在 Tableau 中创建控制图?

    本文作者:Jose Valero 控制图是用于研究流程如何随时间变化,并确定制造或业务流程是否在统计控制状态下的图表. 我相信这对每家公司来说都是一个有益的工具,所以在这篇文章中,我将尝试如何在 Ta ...

最新文章

  1. python管理系统pyqt_pyqt5图书管理系统(源码+安装说明+数据库)
  2. Google帮助IE浏览器实现对SVG支持
  3. mybatis异常invalid comparison: java.util.Date and java.lang.String
  4. shiro框架,自定义realm注入service失败解决办法
  5. linux系统chmod缩写,文件属性控制命令chmod
  6. CPU可以跑多快?地球到火星的距离告诉你!
  7. 指针c语言求电阻的并联值,计算电阻使之符合要求值,,“简单”的难题!!!...
  8. 《中国人工智能学会通讯》——5.4 结 论
  9. 什么是Redis缓存雪崩、缓存穿透和缓存击穿
  10. Linux下DHCP服务的配置相关参数说明
  11. C++_homework_StackSort
  12. Paragon NTFS提示安装分卷失败,怎么解决
  13. 现代通信原理4.3:白噪声
  14. 过滤cuteftp上传下载
  15. 如何设置华为悦盒Ubuntu系统的无线WiFi自动连接
  16. 防火墙基础之路由器与防火墙单臂路由和DHCP接口地址池的配置
  17. 利用好 git bisect 这把利器,帮助你快速定位疑难 Bug
  18. 艾美捷FLIVO探针:用于细胞活体凋亡检测,助力科研!
  19. 身份证号码验证web服务(完整源码)
  20. 微信支付0.2%费率商户号开通

热门文章

  1. 5.1.1 IO设备的概念与分类
  2. Freemarker条件判断
  3. mysql 分词搜索_MySQL5.7分词全文检索思路
  4. 日志框架,选择Logback Or Log4j2?
  5. String类为什么被设计为不可变的?
  6. 并发基础篇(一) 线程介绍
  7. 算法-Valid Anagram
  8. java基础集合类之set
  9. 欢迎使用Markdown编辑器写博客
  10. 判断文件是否损坏_称重传感器好坏的判断方法,看完秒懂!