我读了一些答案,通常他们使用一组或其他数据结构来确保没有重复。但是对于我的情况,我已经在数据库中存储了很多随机字符串,我必须确保生成的随机字符串不应该存在于数据库中。
我并不认为从数据库中检索所有随机字符串到一个集合然后生成随机字符串是一个好主意......
我发现System.currentTimeMillis()会生成"随机"数字,但如何将该数字转换为随机字符串是一个问题...我需要一个长度为8的字符串。
任何建议将不胜感激
答案 0 :(得分:3)
您可以使用 Apache库:RandomStringUtils
RandomStringUtils.randomAlphanumeric(8).toUpperCase() // for alphanumeric
RandomStringUtils.randomAlphabetic(8).toUpperCase() // for pure alphabets
randomAlphabetic(int count) 创建一个随机字符串,其长度为指定的字符数。
randomAlphanumeric(int count) 创建一个随机字符串,其长度为指定的字符数。
答案 1 :(得分:0)
方法currentTimeMillis()
返回当前时间(以毫秒为单位),以便将long转换为字符串,s.substring(5, s.length())
为您提供最后8位数的毫秒数,这些数字在每毫秒内始终相同。
public static void main(String[] args) {
String s = String.valueOf(System.currentTimeMillis());
System.out.println(s.substring(5, s.length()));
}
每次都必须确保数据库中此字符串可用。
答案 2 :(得分:0)
所以这里有两个问题 - 创建随机字符串,并确保数据库中没有重复。
如果您没有绑定8个字符,则可以使用UUID作为上面建议的评论者。 UUID类返回一个强度,这在统计上非常不可能与先前生成的UUID重复,因此您可以将其用于此精确目的,而无需检查它是否已存在于您的数据库中。
UUID.randomUUID().toString();
或者,如果您不关心唯一ID是什么,只要它的唯一性,您可以使用身份或自动增量字段,这几乎是所有数据库的支持。如果您这样做,虽然您在提交之后已经读取了记录,以获取db分配的标识。
生成一个看起来像这样的字符串:
5e0013fd-3ed4-41b4-b05d-0cdf4324bb19
如果你必须有一个8个字符的字符串作为你的唯一ID,并且你不想导入apache库,你可以生成随机的8个字符串,如下所示:
final String alpha="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
final Random rand= new Random();
public String myUID() {
int i = 8;
String uid="";
while (i-- > 0) {
uid+=alpha.charAt(rand.nextInt(26));
}
return uid;
}
要确保它不是重复的,您应该为包含它的数据库中的列添加唯一索引。 您可以先查询数据库,以确保在插入行之前没有行具有该ID,或者捕获异常并在生成重复时重试。