日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

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

發(fā)布時間:2025/3/20 java 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java creat uid_关于uniqueidentifier:如何在Java中创建唯一ID? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本問題已經(jīng)有最佳答案,請猛點這里訪問。

我正在尋找在Java中創(chuàng)建唯一ID作為String的最佳方法。

任何指導表示贊賞,謝謝。

我應該提到我正在使用Java 5。

看看這個stackoverflow.com/a/9176060/1737819。

創(chuàng)建一個UUID。

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

它不是人類可讀的全部...

@pjp:真正隨機生成的ID通常不可讀。并且使其可讀性通常會使其更長,從而使可讀性降低。

我不知道他想要一個人類可讀的唯一ID ...這會大大增加難度

另一個注意事項-如果您只需要應用程序唯一性,而AtomicInteger(如Michael Borgwardt所述)是更好的選擇,但是如果您需要全局唯一性,那么UUID是一個更好的選擇。

謝謝,這是我現(xiàn)在所需要的,盡管Adamskis的回答也非常好,將來我可能還需要更多類似的東西。

為什么不能使用System.currentTimeMillis生成單調(diào)遞增的序列并添加一些隨機的正整數(shù)鹽?

您當然可以@Farhad,但是UUID是唯一保證跨大流量的多臺服務器唯一性的方法。

如果您需要簡短的,人類可讀的ID,并且每次JVM運行僅需要它們是唯一的:

private static long idCounter = 0;

public static synchronized String createID()

{

return String.valueOf(idCounter++);

}

編輯:注釋中建議的替代方案-這依賴于引擎蓋下的"魔術(shù)"來確保線程安全,但具有更高的可伸縮性和安全性:

private static AtomicLong idCounter = new AtomicLong();

public static String createID()

{

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

}

我更喜歡Michaels方法而不是UUID方法,因為在調(diào)試時順序ID通常更有用/更容易。同樣,也不保證UUID.randomUUID()100%返回唯一值。

@Adamski:只要您不重新啟動JVM,僅運行1個JVM并且計數(shù)器沒有溢出,則此方法將僅創(chuàng)建唯一值。所有這些假設很容易被打破。在這種情況下,UUID.randomUUID()實際上更可靠。

雖然不是100%保證的,但您與任何人發(fā)生碰撞的幾率很低(因為整個空間大于估計存在于宇宙中的原子數(shù)),因此可以保證100%保證。而且,如果您需要全局唯一性,那么這是實現(xiàn)此目標的最簡單方法。但是,如果您只需要局部唯一性(即當前現(xiàn)有應用程序的唯一性),那么AtomicInteger絕對是可行的方法。

java.util.UUID:toString()方法

這是我的兩分錢:我以前實現(xiàn)了一個IdFactory類,該類以[主機名]-[應用程序開始時間]-[當前時間]-[標識符]的格式創(chuàng)建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()已使用"加密強度高"的隨機數(shù)生成器生成了ID。增加更多隨機性是什么意思?您可以根據(jù)時間間隔隨機添加鹽來獲得什么?

如果我沒記錯的話UUID.randomUUID()在創(chuàng)建隨機ID時已經(jīng)使用了時間因子。

恕我直言,阿珀金斯提供了一種優(yōu)雅的解決方案,因為它是本機的,并且使用的代碼更少。

但是,如果您需要較短的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中創(chuàng)建唯一ID,然后在UUID上調(diào)用類似randomUUID()的方法。

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

這將生成隨機的uniqueID,其返回類型將為String。

具有計數(shù)信息的唯一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的機會是什么?

總結(jié)

以上是生活随笔為你收集整理的java creat uid_关于uniqueidentifier:如何在Java中创建唯一ID?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。