我正在尝试生成一个固定长度的唯一标识符,例如Megaupload为上传的文件生成的ID。例如:ALGYTAB5、BCLD23A6等。使用字母A到Z和数字0到9,并且长度固定为8时,总共有2,821,109,907,456种不同的组合。如果其中一个生成的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
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);
听起来像是一个哈希函数的工作。虽然哈希函数不能保证返回唯一标识符,但它在大多数情况下都有效。哈希冲突必须单独处理,但有许多标准技术可供您参考。
具体如何处理冲突取决于您使用此唯一标识符的目的。如果它是一个简单的单向标识符,您可以将ID提供给程序并返回数据,那么在发生冲突的情况下,您可以简单地使用下一个可用的ID。