【问题标题】:How to generate random string with no duplicates in java如何在java中生成没有重复的随机字符串
【发布时间】:2014-12-16 09:22:59
【问题描述】:

我阅读了一些答案,通常他们使用集合或其他一些数据结构来确保没有重复。但是对于我的情况,我已经在数据库中存储了很多随机字符串,我必须确保生成的随机字符串不应该存在于数据库中。

我不认为将数据库中的所有随机字符串检索到一个集合中然后生成随机字符串是一个好主意...

我发现 System.currentTimeMillis() 会生成一个“随机”数字,但是如何将该数字转换为随机字符串是一个问题……我需要一个长度为 8 的字符串。

任何建议将不胜感激

【问题讨论】:

  • 确保您可以将 7 位随机数附加到某个字母以使其成为 8 位随机字符串。System.currentTimeMillis 不会生成随机数。它只是为您提供从 1970 年 1 月 1 日 UTC 开始的当前时间(以毫秒为单位)
  • 首先,currentTimeMillis 甚至都不是随机的......我认为你的前提基本上是有缺陷的,但你只需要生成一个随机字符串并检查数据库是否存在,这比将数据库读入一组要轻得多。看看UUID's - 他们可能对你有用。
  • 您不需要从数据库中检索所有字符串,对您的随机字符串列使用 UNIQUE 约束。以这种方式插入任何重复的字符串都会失败。

标签: java string random


【解决方案1】:

您可以为此使用 Apache 库RandomStringUtils

RandomStringUtils.randomAlphanumeric(8).toUpperCase() // for alphanumeric

RandomStringUtils.randomAlphabetic(8).toUpperCase() // for pure alphabets

随机字母(整数计数) 创建一个随机字符串,其长度为指定的字符数。

随机字母数字(整数计数) 创建一个随机字符串,其长度为指定的字符数。

【讨论】:

    【解决方案2】:

    所以这里有两个问题 - 创建随机字符串,并确保数据库中没有重复。
    如果您没有绑定到 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;
    }
    

    为了确保它不是重复的,您应该在包含它的数据库中的列中添加一个唯一索引。 您可以先查询 db 以确保在插入行之前没有任何行具有该 id,或者捕获异常并在生成重复项时重试。

    【讨论】:

      【解决方案3】:

      方法 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()));
      }
      

      你必须确保这个字符串每次都在你的数据库中可用或不可用。

      【讨论】:

      • ...长度为 8?你为什么不使用s
      • System.currentTimeMillis()返回超过13位时会发生什么?
      猜你喜欢
      • 2011-02-21
      • 1970-01-01
      • 2017-01-06
      • 2013-08-06
      • 2010-12-07
      • 2013-03-02
      • 2011-08-06
      • 1970-01-01
      相关资源
      最近更新 更多