Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中生成固定长度的唯一标识符?_Java_Uniqueidentifier - Fatal编程技术网

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

如何在Java中生成固定长度的唯一标识符?,java,uniqueidentifier,Java,Uniqueidentifier,我试图生成一个固定长度的唯一标识符,如Megaupload为上传文件生成的ID 例如: ALGYTAB5 BCLD23A6 在本例中,使用A-Z和0-9,固定长度为8,总的不同组合为282110907456 如果生成的一个id已经被获取了呢。这些ID将被存储在一个数据库中,不应该被多次使用 我如何在Java中实现这一点 谢谢。嗯。。。您可以按以下方式模拟较小的GUID。让字符串的前4个字节为Unix之后经过编码的当前时间-秒。最后4个只是一个随机组合。在这种情况下,两个ID重合的唯一方式是它

我试图生成一个固定长度的唯一标识符,如Megaupload为上传文件生成的ID

例如:

  • ALGYTAB5
  • BCLD23A6
在本例中,使用A-Z和0-9,固定长度为8,总的不同组合为282110907456

如果生成的一个id已经被获取了呢。这些ID将被存储在一个数据库中,不应该被多次使用

我如何在Java中实现这一点


谢谢。

嗯。。。您可以按以下方式模拟较小的
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

我们正在使用数据库检查它们是否已经存在。如果ID的数量与可能的数量相比较低,那么您应该相对安全

您还可以查看一下
UUID
类(尽管它是16字节的UUID)。

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


具体地说,处理冲突的方式取决于使用此唯一标识符的目的。如果它是一个简单的单向标识符,您在其中为程序提供ID并返回数据,那么您只需在发生冲突时使用下一个可用ID即可。

我尝试了@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);
UUID idOne=UUID.randomuid();
UUID idTwo=UUID.randomuid();
UUID idThree=UUID.randomUUID();
UUID idFour=UUID.randomUUID();
字符串时间=idOne.toString().replace(“-”,”);
字符串time2=idTwo.toString().replace(“-”,”);
字符串time3=idThree.toString().replace(“-”,”);
字符串time4=idFour.toString().replace(“-”,”);
StringBuffer数据=新的StringBuffer();
数据。追加(时间);
数据追加(time2);
数据追加(时间3);
数据追加(时间4);
SecureRandom=新的SecureRandom();
int beginIndex=random.nextInt(100)//开始索引+字符串长度<数据长度
int-endIndex=beginIndex+10//所需字符串的长度
字符串yourID=data.substring(beginIndex,endIndex);

希望这有帮助

遵循以下步骤:

  • generateId()
  • 通过查询数据库检查是否已发出
  • 如果是,请再次调用generateId(),直到在db中找不到它为止

  • 不想使用自动递增ID的理由是什么?这应该很难猜测。你能使用伪随机数生成器生成随机字符码吗?这可能help@lollancf37感谢您添加链接,尽管我更愿意添加当前的Java 6版本: