具有固定长度的唯一字母数字字符串

时间:2013-12-19 11:02:11

标签: java

如何生成唯一字母数字字符串,其中固定长度为8个字符。我希望将它基于Id +当前时间。
我尝试使用MD5但它的字符串太长了

谢谢!

3 个答案:

答案 0 :(得分:2)

问题是8个字母数字字符很可能太少而不能保证唯一性......使用这种方法。

你只需要做一些算术。将应用程序每秒生成的id数乘以应用程序预期“生存”的预期秒数。现在计算出你需要多少个字母数字字符来编码这个数字......这样就可以得出你的id的“时间戳”部分需要多大。然后为字符串的“id”部分添加字符。

IMO,最好的方法(如果你必须使用短字符串)是生成部分或完全随机的字符串,然后根据所有先前发出的id字符串的(大)表检查它们。如果发生碰撞,请生成另一个字符串,然后重复。


如果您还希望您的ID难以预测(根据您的评论),那么“随机数”方法最好。确保使用加密质量的RNG或PRNG。基于时间戳的方法的问题在于,生成的ID将更容易预测......或猜测。

答案 1 :(得分:1)

使用java.util.UUID

UUID uuid = UUID.randomUUID();
String id = uuid.toString().substring(0, 8);

答案 2 :(得分:1)

字符串不能是唯一的:唯一性是指没有重复项的集合中的项目,称为。给定一组符号(您在问题中说的字母数字)和字符串长度(在您的示例8中),已知数量的可能组合可能满足您的需求,也可能不足够。

您的要求无法满足(至少不符合您提供的信息)。如果您真的希望令牌是唯一的,则保证给定输入(id,timestamp)是关键(即对于每个给定的ID,您将永远不会有两个或更多相同的时间戳),将ID和时间戳并排放置。

ID列的大小将是用户名的最大大小+时间戳的固定大小。