【问题标题】:generate 16 digit random numbers in oracle在 oracle 中生成 16 位随机数
【发布时间】:2013-03-04 21:47:34
【问题描述】:

我必须编写在registered_security_numbers 中注册16 位安全号码的oracle 程序。 我知道安全号码的前 6 位是 1234 111234 12 ,其余 10 位是随机生成的。

我有两种可能的解决方案:

  1. 编写第二个过程,生成所有可能的安全号码并将它们插入到possible_security_numbers表中,设置属性free=1。 然后,当我收到注册新安全号码的请求时,我会在possible_security_numbers 表中查询一个随机安全号码,该安全号码是免费的,并将其插入registered_security_numbers

  2. 每次我收到注册安全号码的请求时,我都会从 1234 1100 0000 0000 - 1234 1299 9999 9999 范围内生成随机数,直到获得安全号码,该号码在registered_security_numbers 表并将其插入registered_security_numbers

(1) 我不喜欢的方法,因为possible_security_numbers 表将包含数十亿个条目,我不确定它有多好或可以运行多快的选择/更新。

(2) 我不喜欢的方法,因为如果我在registered_security_numbers 表中有很多记录,则从一个范围内生成随机数可能会重复很多次。

我想知道是否有人有其他解决方案或可以评论我的解决方案,这对我来说似乎很糟糕……

【问题讨论】:

  • 如果使用的 id 将是稀疏的,我不会预先生成。为什么它必须是随机的?你能选择一个随机数,如果不可用则找到第一个大于或等于的可用 id(或其他一些类似的算法)?

标签: algorithm oracle bigdata


【解决方案1】:

您实际上要生成多少个数字?

想象一下,您最多会生成 100 万 (10^6) 个数字。如果是这样,您需要生成第二个随机数的几率大约是 10^-5 中的 5(0.00005 或 0.005%)。如果是这种情况,那么担心偶尔生成第二个数字的费用或几乎不可能生成第三个数字是没有意义的。第二种方法效率更高。

另一方面,假设您打算随着时间的推移生成 10 亿个数字。如果是这种情况,那么到最后,您需要生成第二个数字的几率是 5%,并且您需要合理频繁地生成 3 或 4 个数字。在这里,权衡取舍要困难得多。根据业务的不同,捕获唯一约束违规异常并在某些调用上生成多个号码对性能的影响可能会导致服务经常违反 SLA,而枚举有效号码可能更有效。

另一方面,假设您打算随着时间的推移生成所有 200 亿个数字。如果是这种情况,到最后,您预计必须生成 100 亿个随机数,然后才能找到剩余的一个有效数字。如果是这种情况,明显的优势将是第一个选项,即枚举所有可能的数字并跟踪哪些数字已被使用。

【讨论】:

    猜你喜欢
    • 2020-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-26
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 2013-05-05
    相关资源
    最近更新 更多