如何生成难以猜测的推荐/优惠券代码?

时间:2019-05-27 16:29:24

标签: encryption-symmetric

我很难提出一种可以创建简短(8个字符)引荐代码的算法。我想使用一种易于记忆的模式,在该模式中不可能在代码中出现令人反感的单词。我也不想让任何字母与数字混淆-所以不要1,l,0和O。我提出的模式是 aa22aa22 。此模式基本上是两个字母字符,然后是两个数字字符,然后是两个字母字符,然后是两个数字字符。字母字符均为小写。这种模式支持超过40亿种可能的代码。

现在是棘手的部分。我需要将生成的代码存储在Salesforce中。我认为这需要以非随机的方式完成,因为如果我随机进行,则必须检查是否已经生成了代码。然后,这会进入Salesforce对您施加的限制条件限制。如果您不熟悉调控器限制,则基本上意味着您查询数据库的次数过多或进程运行的时间过长,基础系统会抛出调控器限制错误。随机代码的创建带来了不确定性,即查找与先前创建的代码不冲突的代码需要进行多少次查询。因此,现在基本上可以归结为创建保证永不重复的代码,这意味着需要按顺序创建它们。顺序方法的问题在于代码易于猜测。

是的,我可以有一个非Salesforce数据存储区,它可以充当记录源,并采用随机方法进行冲突检查,但是我想看看全球社区是否有任何想法可以工作。我试图找到一种弱对称加密算法,该算法可以产生8个字符的密码,但到目前为止我还没有运气。

2 个答案:

答案 0 :(得分:2)

我会选择一种方法,例如使用一些随机数生成器来创建不可重复的序列,例如此处建议的序列:https://stackoverflow.com/a/196164/2331592

您必须选择一个生成器,该生成器最多支持[可能的优惠券数量]组合。 每次绘制随机数时,您都会得到另一个数字,该数字是可以直接转换为优惠券的可能优惠券的索引(->排列)(但由于优惠券的数字具有不同的基数,因此更改起来并不容易数字基)

示例:

如果您的代码模式看起来像a1a 其中a代表[abcde]1代表[123]。 这将进行75个排列。

00 a1a    15 b1a     30 c1a     45 d1a     60 e1a
01 a1b    16 b1b     31 c1b     46 d1b     61 e1b
02 a1c    17 b1c     32 c1c     47 d1c     62 e1c
03 a1d    18 b1d     33 c1d     48 d1d     63 e1d
04 a1e    19 b1e     34 c1e     49 d1e     64 e1e
05 a2a    20 b2a     35 c2a     50 d2a     65 e2a
06 a2b    21 b2b     36 c2b     51 d2b     66 e2b
07 a2c    22 b2c     37 c2c     52 d2c     67 e2c
08 a2d    23 b2d     38 c2d     53 d2d     68 e2d
09 a2e    24 b2e     39 c2e     54 d2e     69 e2e
10 a3a    25 b3a     40 c3a     55 d3a     70 e3a
11 a3b    26 b3b     41 c3b     56 d3b     71 e3b
12 a3c    27 b3c     42 c3c     57 d3c     72 e3c
13 a3d    28 b3d     43 c3d     58 d3d     73 e3d
14 a3e    29 b3e     44 c3e     59 d3e     74 e3e

选择基于
的简单LCG x = (a*x + c) mod m
设置
x = 1(可以使用任何数字)
a = 5(可以使用任何大数字-请确保您的算术不会溢出)
c = 0
m = 73

m设置为置换计数的第二个最小素数,以确保生成器始终创建有效数字,尽管最后不包括许多有效组合-因此该生成器将永远不会生成# 73和#74,从此以后就再也没有#0了,因此始终创建0

这是发电机的输出,直到再次循环:

01:  5      11: 31      21: 17      31: 47     41: 14    51: 43    61: 33    71: 44
02: 25      12:  9      22: 12      32: 16     42: 70    52: 69    62: 19    72:  1
03: 52      13: 45      23: 60      33: 7      43: 58    53: 53    63: 22    --> 01:  5
04: 41      14:  6      24:  8      34: 35     44: 71    54: 46    64: 37
05: 59      15: 30      25: 40      35: 29     45: 63    55: 11    65: 39
06:  3      16:  4      26: 54      36: 72     46: 23    56: 55    66: 49
07: 15      17: 20      27: 51      37: 68     47: 42    57: 56    67: 26
08:  2      18: 27      28: 36      38: 48     48: 64    58: 61    68: 57
09: 10      19: 62      29: 34      39: 21     49: 28    59: 13    69: 66
10: 50      20: 18      30: 24      40: 32     50: 67    60: 65    70: 38

每次我们得到不同的索引。通过该索引,我们可以在上表中查找代码,但是我们也可以计算出它:

我们代码中的数字具有不同的值(在十进制数字系统中,每个数字的值比前一个数字高十倍)

a职位有5种可能性,1职位有3种可能性。

             a3,     a2,    a1
possibilies:  5       3     5
digit value: a3*3*5  a2*5   a1*1
digit value: a3*15   a2*5   a1*1

each of the possibilities has an attached value:

letters  a b c d e
value    0 1 2 3 4

numbers  1 2 3
value    0 1 2  <-- this is a bit counter intuitive - but we need to start at 0

e3b -->      e≙4     3≙2   b≙1
             4*3*5 + 2*5   + 1*1
          =  60    + 10    + 1
          =  71
code e3b --> #71

另一种方法是从索引中获取代码而无需查找表。
每个数字都可以通过将值除以(整数除法)数字位数并取该数字的可能位数的模来求出

#51
    a1 = (51 /  1) mod 5 = 1 ≙ b    
    a2 = (51 /  5) mod 3 = 1 ≙ 2
    a3 = (51 / 15) mod 5 = 3 ≙ d

#51 --> code d2b

作为一般提示: 我会从内部编号中解耦代码的表示形式。 示例中的数字将是排列索引。 您只需要知道最后发布的索引,即可生成下一个索引。

索引的表示方式可能与此无关。在我们的例子中是a1a表示形式。

需要查找的一些内容:
https://en.wikipedia.org/wiki/Positional_notation用于数字表示
https://en.wikipedia.org/wiki/Linear_congruential_generator了解生成器的工作原理以及如何对其进行参数化

答案 1 :(得分:0)

在做复杂的事情并研究随机性之前,为什么不仅仅生成一个UUID?

https://en.wikipedia.org/wiki/Universally_unique_identifier