如何生成唯一字母数字字符串,其中固定长度为8个字符。我希望将它基于Id +当前时间。
我尝试使用MD5但它的字符串太长了
谢谢!
答案 0 :(得分:2)
问题是8个字母数字字符很可能太少而不能保证唯一性......使用这种方法。
你只需要做一些算术。将应用程序每秒生成的id数乘以应用程序预期“生存”的预期秒数。现在计算出你需要多少个字母数字字符来编码这个数字......这样就可以得出你的id的“时间戳”部分需要多大。然后为字符串的“id”部分添加字符。
IMO,最好的方法(如果你必须使用短字符串)是生成部分或完全随机的字符串,然后根据所有先前发出的id字符串的(大)表检查它们。如果发生碰撞,请生成另一个字符串,然后重复。
如果您还希望您的ID难以预测(根据您的评论),那么“随机数”方法最好。确保使用加密质量的RNG或PRNG。基于时间戳的方法的问题在于,生成的ID将更容易预测......或猜测。
答案 1 :(得分:1)
UUID uuid = UUID.randomUUID();
String id = uuid.toString().substring(0, 8);
答案 2 :(得分:1)
字符串不能是唯一的:唯一性是指没有重复项的集合中的项目,称为集。给定一组符号(您在问题中说的字母数字)和字符串长度(在您的示例8中),已知数量的可能组合可能满足您的需求,也可能不足够。
您的要求无法满足(至少不符合您提供的信息)。如果您真的希望令牌是唯一的和,则保证给定输入(id,timestamp)是关键(即对于每个给定的ID,您将永远不会有两个或更多相同的时间戳),将ID和时间戳并排放置。
ID列的大小将是用户名的最大大小+时间戳的固定大小。