如何在不与以前生成的数字发生时间冲突的情况下生成6-8位随机数
本文关键字:时间 冲突 情况下 随机数 6-8位 数字 | 更新日期: 2023-09-27 18:20:55
在这个场景中,我有一些经理(大约150人)。他们的日常工作之一是生成50(恒定)授权代码(6-8位数字),这些代码与Id一起存储在数据库中。如果使用了任何授权代码,则该代码被标记为已使用,并在它们15天大并已使用时触发删除它们。
在我的表格中,我已将授权码设置为唯一密钥。我生成一个随机数,然后查询数据库,如果它存在,我生成另一个或保存它。
除了我检查数据库中数字是否存在的逻辑之外,一切都很好。这种往返+检查造成了重大延误,截至目前,有超过1090083个未决授权代码。由于这些授权码正在流通,我们无法撤销它,而且以目前的负载,需要一段时间才能找到新的号码。
我需要在不同的逻辑中实现它,对于该逻辑,执行速度应该是低所使用的随机数的整数。
我的桌子设计如下
slno(auth increment)|| auth_code(随机码)|| auth_by(由创建)||已使用(1=已使用/0=未使用)
最简单的方法是生成随机数,如果得到重复,则生成新的随机id。这是有效的,因为根据你的数据,得到重复的可能性很小。
如果这不能说服你,你可以想出很多方案,从数学上保证数字是唯一的,看起来仍然是随机的,但它会变得复杂。
考虑一下这一点。如果随机数是唯一的,并且以某种(code_id, code, other_data)
表的方式存储在基中,那么您只需在基中添加另一个表:(code, code_id)
,其中code
字段被索引,从而可以进行一些不错的对数搜索。
但考虑到这一点,您也可以在第一个表中创建一个额外的键。只要code
是唯一的,它就会正常工作。
如果您的数据库不支持创建唯一的id:
-用所有随机数建立一个表,这些随机数按值及其大小已存储并可用。
- 随机选择此表中的一个元素
- 获取后继元素。如果后继元素是该元素的邻居,取下一个后继元素。如果到达最后一个元素,请从元素,现在取前一个元素
- 现在只需选择一个随机范围和元素next元素,并得到你的随机数
- 准备好了
示例:您将所有id存储在一个排序表中。假设这是例如
{8901045、2345、2346、4087}
第一步:随机选择其中一个。例如,通过C#
Random random = new Random();
int indexOfNumber = random.Next(0, myTableSize);
第二步:你得到了索引,假设它是2。你现在得到了索引3的下一个数字,它是2346。不幸的是,它是一个直接邻居,所以您继续索引4。这是4087。
第三步:通过创建您的号码
int myRandomNumber = previousElement + random.Next(1,nextElement-previousElement);
在这种情况下:
int myRandomNumber = 2346 + random.Next(1, 4087-2346);
存储新的随机数。这样,您将从数据库中读取大部分两个元素(可能还有更多)独立于数据库大小的。创建两个随机数是无关紧要的。如果索引在末尾(只需反转搜索方向),则必须只关注边缘情况。