当前位置: 首页 > 面试题库 >

Java:唯一的10位数字ID

费星晖
2023-03-14
问题内容

我需要在Java中生成一个唯一的10位ID。这些是此ID的限制:

  • 仅数字
  • 最多10位数字
  • 每秒最多可以创建10个不同的ID
  • 必须是唯一的(即使应用程序重新启动)
  • 无法在数据库中保存号码
  • 尽快不给系统增加太多延迟

到目前为止,我发现的最佳解决方案是:

private static int inc = 0;

private static long getId(){

    long id = Long.parseLong(String.valueOf(System.currentTimeMillis())
            .substring(1,10)
            .concat(String.valueOf(inc)));
    inc = (inc+1)%10;
    return id;
}

此解决方案具有以下问题:

  • 如果出于任何原因需要每秒钟创建10个以上的ID,则此解决方案将不起作用。
  • 在大约32年内,此ID可以重复(这可能是可以接受的)

还有其他解决方案来创建此ID吗?

我没有想到的其他问题吗?

谢谢你的帮助,


问题答案:

这是对您的一个小改进,但应该具有弹性。

本质上,除非当前的时间自上次ID以来一直未勾选,否则我们使用当前时间(以毫秒为单位),在这种情况下,我们只返回return last + 1

private static final long LIMIT = 10000000000L;
private static long last = 0;

public static long getID() {
  // 10 digits.
  long id = System.currentTimeMillis() % LIMIT;
  if ( id <= last ) {
    id = (last + 1) % LIMIT;
  }
  return last = id;
}

因为它应该以相对较短的周期速率管理高达每秒1000次。要延长循环速率(但要缩短分辨率),可以使用(System.currentTimeMillis() / 10) % 10000000000L(System.currentTimeMillis() / 100) % 10000000000L



 类似资料:
  • 问题内容: 我正在尝试使用下面的代码来生成10位唯一的随机数。根据我的要求,我必须创建大约5000个唯一编号。这无法正常工作。它还会生成- ve数字。同样,有时生成的数字中缺少一两位数字,导致8或9个数字而不是10。 问题答案: 我认为您获得8/9位数字值和负数的原因是您要添加一个(带符号的64位值),该值可能大于的正数范围(32位值)。 该值正在溢出,处于负32位范围内或几乎缠绕到(由于是带符号

  • 问题内容: 我正在开发一个需要生成一些唯一编号的应用程序,并且实际上没有预定义的限制,因此使用Java UUD生成器并且运行良好。现在,我们对生成12位唯一的随机数有了新的要求。 谁能指出我实现这一目标的一些好的方法/算法,因为我看不到UUID生成数字中的任何可能性。 提前致谢 问题答案: 通过调用生成每个数字。为了保持唯一性,您可以通过将随机数保存在集合中并检查集合中是否包含您每次生成的数字来跟

  • 问题内容: 我正在尝试获取一个随机数列表,并将其放入队列中,而不会重复任何随机数。 通过上面的代码,我得到了一些随机数的重复 有人知道怎么做吗? 问题答案: 这个怎么样: 在某个范围内“添加唯一的随机数”等效于将范围内的所有数字相加,然后对结果进行混排。

  • 我知道Sieve的算法,直到现在我一直在用它来得到高达10亿的素数。 但现在我需要知道一个10位数是素数还是不是素数,而Sieve的算法无法在时间限制内计算出来。 我搜索了很多,找到了费马的素数检验,但它没有成功,因为有些部分我不能理解,而有些部分告诉我,它只是通过一些迭代来判断它是不是可能的素数。 我想知道,在1秒左右的时间内,如何测试一个这么大的数是否为素数?最有效的解决方案/算法是什么? 编

  • 问题内容: 我只是在学习Java,并且正在尝试让我的程序检索数字的第一个数字- 例如543应该返回5,依此类推。我想转换为字符串,但是我不确定如何将其转换回字符串?谢谢你的帮助。 问题答案: int number = 534; int firstDigit = Integer.parseInt(Integer.toString(number).substring(0, 1));

  • 我只是在练习lamdas java 8。我的问题如下 那么,我如何使这个lambdas表达式递归,以便它也能在第二种情况下工作呢?我可以用lambda表达式创建一个方法,并每次调用它,直到返回值<10,但我在想lambdas中是否有任何方法。 谢谢