【问题标题】:Unique random int from sequence来自序列的唯一随机整数
【发布时间】:2015-05-31 10:57:35
【问题描述】:

我正在尝试创建唯一的随机标识符策略。我不想存储或查询所有已使用的 ID,我想将生成数字 0 -> Integer.MAX_VALUE 的序列用作唯一性来源。我所缺少的东西是将序列中的每个数字投影到同一范围内的另一个数字的函数。

您能否为此指出一些快速双射函数? (最好在 Java 中)。

提前致谢

【问题讨论】:

  • 所以你想要一个简单的计数器?你是什​​么意思:“我所缺少的东西是将序列中的每个数字投影到同一范围内的另一个数字的函数。”
  • 为什么要停在Integer.MAX_VALUE。为什么不停留在 Long.MAX_VALUE'?您是否针对特定数据库?为什么不让数据库处理呢?
  • Tom:我想要一个生成“随机”输出的计数器。一定不能轻易猜出已经生成的标识符的顺序或数量。
  • 您希望您的标识符“随机”用于什么目的?为什么自动递增数字不能满足您的要求?是为了实现哈希表还是出于安全原因?

标签: java database uniqueidentifier


【解决方案1】:

如果你想产生“不可猜测”的随机数,你可以取SecureRandom.nextLong() 并附加System.nanoTime()。 nanoTime 部分更容易猜测,但在很短的时间后不会重复。 nextLong 部分将来可能会重复,但很难猜测。

请注意,如果您在应用程序中硬编码了任何确定性双射函数,并且有人能够获取并反转它(获取源代码、反编译类文件等),那么您的 ID 将受到损害:这将非常容易通过给定的数字查找下一个/上一个数字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-20
    • 1970-01-01
    • 2015-01-16
    • 1970-01-01
    • 2012-12-29
    • 2017-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多