我必须编写甲骨文程序,在registered_security_numbers
中注册16位的安全号码。我知道安全号码的前6位要么是1234 11,要么是1234 12,其余10位是随机生成的。
我有两个可能的解决方案:
possible_security_numbers
表中,设置属性free=1
。然后,当我收到注册一个新的安全号码的请求时,我会查询possible_security_numbers
表中的随机安全号,这是免费的,并将其插入到registered_security_numbers
中。registered_security_numbers
表中不存在的安全号码并将其插入registered_security_numbers
。(1)我不喜欢这样的方法,因为possible_security_numbers
表将包含数十亿个条目,而且我不确定它有多好,或者运行select/update的速度有多快。
(2)我不喜欢的方法,因为如果我在registered_security_numbers
表中有很多记录,从一个范围产生随机数可能会重复多次。
我想知道是否有人有其他的解决方案,或者可以评论我的解决方案,这对我来说是很糟糕的,…。
发布于 2013-03-04 22:02:32
你到底要生成多少个数字?
想象一下,最多要生成100万个(10^6)个数字。如果是这样的话,您需要生成第二个随机数的概率大约是10^-5中的5 (0.00005 %或0.005%)。如果是这样的话,那么担心偶尔生成第二个数字或几乎不可能生成第三个数字的开销是没有意义的。第二种方法将更加有效。
另一方面,想象一下,随着时间的推移,你将产生10亿个数字。如果是这样的话,那么到最后,你需要生成第二个数字的概率是5%,而且你需要合理地经常生成3到4个数字。在这里,权衡的难度要大得多。根据业务的不同,捕获唯一的约束违反异常并在某些调用上生成多个数字的性能影响可能会导致服务经常违反SLA,而枚举有效数字的效率一般更高。
第三,想象一下,随着时间的推移,你将产生所有200亿的数字。如果是这样的话,到最后,你将需要生成100亿个随机数,然后才能找到剩余的有效数字。如果是这样的话,那么第一个选择就是枚举所有可能的数字并跟踪使用了哪些数字,这是一个明显的优势。
https://stackoverflow.com/questions/15211769
复制相似问题