1

我必须编写在registered_security_numbers. 我知道安全号码的前 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 9999registered_security_numbers范围内生成随机数,直到获得安全号码,该号码在表格中不存在 并将其插入registered_security_numbers.

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

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

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

4

1 回答 1

2

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

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

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

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

于 2013-03-04T22:02:32.760 回答