我正在尝试生成固定长度的唯一标识符,例如Megaupload为上传的文件生成的ID。
例如:
在本例中,使用A-Z和0-9,固定长度为8,总的不同组合为2,821,109,907,456。
如果已经生成了其中一个生成的ID,该怎么办?这些ID将存储在数据库中,不应多次使用。
如何在Java中实现这一目标?
谢谢。
答案 0 :(得分:4)
嗯......你可以通过以下方式模仿较小的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 :(得分: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);
希望这有帮助!
答案 2 :(得分:0)
我们正在使用数据库检查它们是否已存在。如果ID数量与可能的数量相比较低,则应该相对安全。
您可能还要查看UUID
类(尽管它是16字节的UUID)。
答案 3 :(得分:0)
听起来像hash function的工作。您不是100%保证哈希函数将返回唯一标识符,但它在大多数情况下都有效。哈希碰撞必须单独处理,但有许多标准技术供你研究。
具体来说,处理冲突的方式取决于您使用此唯一标识符的内容。如果它是一个简单的单向标识符,您为程序提供ID并返回数据,那么您可以在发生冲突时使用下一个可用的ID。
答案 4 :(得分:0)
请按照以下步骤操作: