如何在Java中生成固定长度的唯一标识符?

10
我正在尝试生成一个固定长度的唯一标识符,例如Megaupload为上传的文件生成的ID。例如:ALGYTAB5、BCLD23A6等。使用字母A到Z和数字0到9,并且长度固定为8时,总共有2,821,109,907,456种不同的组合。如果其中一个生成的ID已经被占用,那么这些ID将存储在数据库中,不能再次使用。如何在Java中实现这个功能?谢谢。

生成Java中全局唯一标识符(UUID)的方法: https://dev59.com/rnVC5IYBdhLWcg3ww0Dr 参考文档: http://download.oracle.com/javase/1,5.0/docs/api/java/util/UUID.html - Jacob
不想使用自动递增ID的理由是什么? - Kirk Woll
2
它应该很难猜测。 - Alfredo Osorio
你能否只使用伪随机数生成器来生成随机字符代码? - David R Tribble
4个回答

7

嗯...你可以通过以下方式模拟一个较小的GUID。首先,让字符串的前4个字节成为编码后的当前时间-Unix经过的秒数。最后4个字节则是随机组合。在这种情况下,两个ID重复的唯一可能性是它们在同一秒钟内构建。由于另外4个随机字符,这种情况的概率非常非常低。

伪代码:

get current time (4 byte integer
id[0] = 1st byte of current time (encoded to be a digit or a letter)
id[1] = 2nd
id[2] = 3rd
id[3] = 4th
id[4] = random character
id[5] = random character
id[6] = random character
id[7] = random character

1
我已尝试@Armen的解决方案,但我想提供另一个解决方案。
    UUID idOne = UUID.randomUUID();
UUID idTwo = UUID.randomUUID();
UUID idThree = UUID.randomUUID();
UUID idFour = UUID.randomUUID();

String time = idOne.toString().replace("-", "");
String time2 = idTwo.toString().replace("-", "");
String time3 = idThree.toString().replace("-", "");
String time4 = idFour.toString().replace("-", "");

StringBuffer data = new StringBuffer();
data.append(time);
data.append(time2);
data.append(time3);
data.append(time4);

    SecureRandom random = new SecureRandom();
int beginIndex = random.nextInt(100);       //Begin index + length of your string < data length
int endIndex = beginIndex + 10;            //Length of string which you want

String yourID = data.substring(beginIndex, endIndex);

希望这能帮到您!

0
我们正在使用数据库来检查它们是否已经存在。如果ID的数量与可能数量相比较低,那么你应该是相对安全的。
你也可以看一下UUID类(尽管它是16字节的UUID)。

这个链接可能会有所帮助:http://download.oracle.com/javase/1,5.0/docs/api/java/util/UUID.html - lollancf37
1
@lollancf37感谢您添加链接,虽然我更愿意添加当前的Java 6版本:http://download.oracle.com/javase/6/docs/api/java/util/UUID.html - Thomas

0

听起来像是一个哈希函数的工作。虽然哈希函数不能保证返回唯一标识符,但它在大多数情况下都有效。哈希冲突必须单独处理,但有许多标准技术可供您参考。

具体如何处理冲突取决于您使用此唯一标识符的目的。如果它是一个简单的单向标识符,您可以将ID提供给程序并返回数据,那么在发生冲突的情况下,您可以简单地使用下一个可用的ID。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接