我必须编写oracle过程,在registered_security_numbers
中注册16位数的安全号码。
我知道安全号码的前6位数字是 1234 11 或 1234 12 ,其余10位是随机生成的。
我有两种可能的解决方案:
编写第二个过程,生成所有可能的安全号码并将其插入possible_security_numbers
表,设置属性free=1
。
然后,当我收到注册新安全号码的请求时,我向possible_security_numbers
表查询随机安全号码,该号码是免费的,并将其插入registered_security_numbers
。
每当我收到注册安全号码的请求时,我会从 1234 1100 0000 0000 - 1234 1299 9999 9999 范围生成随机数,直到我获得安全号码,这在我不存在registered_security_numbers
表格并将其插入registered_security_numbers
。
(1)方法我不喜欢因为possible_security_numbers
表将包含数十亿个条目,我不确定它有多好或者选择/更新的运行速度有多快。
(2)方法我不喜欢因为如果我在registered_security_numbers
表中有很多记录,从一个范围生成随机数可能会重复多次。
我想知道是否有人有其他解决方案或可以评论我的解决方案,这对我来说似乎很糟糕......
答案 0 :(得分:2)
您实际要生成多少个数字?
想象一下,你最多会产生100万(10 ^ 6)个数字。如果是这样,您需要生成第二个随机数的概率大约是10 ^ -5(0.00005或0.005%)。如果是这种情况,那么担心偶尔产生第二个数字或几乎不可能产生第三个数字是没有意义的。第二种方法会更有效率。
另一方面,假设您打算随着时间的推移生成10亿个数字。如果是这种情况,那么到最后,您需要生成第二个数字的几率是5%,并且您需要经常合理地生成3或4个数字。在这里,权衡更难以弄清楚。捕获唯一约束违例异常并在某些调用上生成多个数字会对性能产生影响,这可能会导致服务违反SLA通常足够重要,而枚举有效数字的平均效率可能会更高。
第三方面,假设您打算随着时间的推移生成所有200亿个数字。如果是这种情况,那么到最后,您必须在找到剩余的有效数字之前生成100亿个随机数。如果是这种情况,明显的优势将是第一个选择枚举所有可能的数字并跟踪已使用的数字。