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

noc*_*ber 5 encryption-symmetric

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

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

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

vla*_*sch 2

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

\n\n

您必须选择一个支持最多[可能的优惠券数量]组合的生成器。\n每次你抽取一个随机数时,你都会得到另一个数字,它是可能的优惠券的索引(-->排列),可以直接转换为优惠券(但由于你的优惠券数字有不同的基数,所以并不那么容易改变数字基数)

\n\n

例子:

\n\n

如果你的代码模式看起来像a1a\ntherea代表[abcde]1[123] \n这将产生 75 种排列。

\n\n
00 a1a    15 b1a     30 c1a     45 d1a     60 e1a\n01 a1b    16 b1b     31 c1b     46 d1b     61 e1b\n02 a1c    17 b1c     32 c1c     47 d1c     62 e1c\n03 a1d    18 b1d     33 c1d     48 d1d     63 e1d\n04 a1e    19 b1e     34 c1e     49 d1e     64 e1e\n05 a2a    20 b2a     35 c2a     50 d2a     65 e2a\n06 a2b    21 b2b     36 c2b     51 d2b     66 e2b\n07 a2c    22 b2c     37 c2c     52 d2c     67 e2c\n08 a2d    23 b2d     38 c2d     53 d2d     68 e2d\n09 a2e    24 b2e     39 c2e     54 d2e     69 e2e\n10 a3a    25 b3a     40 c3a     55 d3a     70 e3a\n11 a3b    26 b3b     41 c3b     56 d3b     71 e3b\n12 a3c    27 b3c     42 c3c     57 d3c     72 e3c\n13 a3d    28 b3d     43 c3d     58 d3d     73 e3d\n14 a3e    29 b3e     44 c3e     59 d3e     74 e3e\n
Run Code Online (Sandbox Code Playgroud)\n\n

根据
\n x = (a*x + c) mod m
\n设置选择一个简单的LCG
\n x = 1 (可以使用任何数字)
\n a = 5 (可以使用任何大数字 - 只需确保您的算术不会溢出)
\n c = 0
\nm = 73

\n\n

设置m为排列计数的下一个最小质数,以确保生成器始终创建一个有效的数字,尽管最后排除了许多有效组合 - 因此该生成器永远不会生成 #73 和 #74,也永远不会生成#0 从那时起总是0被创建

\n\n

这是生成器的输出,直到它再次循环:

\n\n
01:  5      11: 31      21: 17      31: 47     41: 14    51: 43    61: 33    71: 44\n02: 25      12:  9      22: 12      32: 16     42: 70    52: 69    62: 19    72:  1\n03: 52      13: 45      23: 60      33: 7      43: 58    53: 53    63: 22    --> 01:  5\n04: 41      14:  6      24:  8      34: 35     44: 71    54: 46    64: 37\n05: 59      15: 30      25: 40      35: 29     45: 63    55: 11    65: 39\n06:  3      16:  4      26: 54      36: 72     46: 23    56: 55    66: 49\n07: 15      17: 20      27: 51      37: 68     47: 42    57: 56    67: 26\n08:  2      18: 27      28: 36      38: 48     48: 64    58: 61    68: 57\n09: 10      19: 62      29: 34      39: 21     49: 28    59: 13    69: 66\n10: 50      20: 18      30: 24      40: 32     50: 67    60: 65    70: 38\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n

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

\n\n
             a3,     a2,    a1\npossibilies:  5       3     5\ndigit value: a3*3*5  a2*5   a1*1\ndigit value: a3*15   a2*5   a1*1\n\neach of the possibilities has an attached value:\n\nletters  a b c d e\nvalue    0 1 2 3 4\n\nnumbers  1 2 3\nvalue    0 1 2  <-- this is a bit counter intuitive - but we need to start at 0\n\ne3b -->      e\xe2\x89\x994     3\xe2\x89\x992   b\xe2\x89\x991\n             4*3*5 + 2*5   + 1*1\n          =  60    + 10    + 1\n          =  71\ncode e3b --> #71\n
Run Code Online (Sandbox Code Playgroud)\n\n

另一种方法是从索引获取代码,而不需要查找表。
\n可以通过将值除以数字值(整数除法)并取该数字的可能性数的模来计算每个数字

\n\n
#51\n    a1 = (51 /  1) mod 5 = 1 \xe2\x89\x99 b    \n    a2 = (51 /  5) mod 3 = 1 \xe2\x89\x99 2\n    a3 = (51 / 15) mod 5 = 3 \xe2\x89\x99 d\n\n#51 --> code d2b\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

指数的表示方式可能与此无关。在我们的例子中是a1a代表。

\n\n

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

\n