我很难提出一种可以创建简短(8个字符)引荐代码的算法。我想使用一种易于记忆的模式,在该模式中不可能在代码中出现令人反感的单词。我也不想让任何字母与数字混淆-所以不要1,l,0和O。我提出的模式是 aa22aa22 。此模式基本上是两个字母字符,然后是两个数字字符,然后是两个字母字符,然后是两个数字字符。字母字符均为小写。这种模式支持超过40亿种可能的代码。
现在是棘手的部分。我需要将生成的代码存储在Salesforce中。我认为这需要以非随机的方式完成,因为如果我随机进行,则必须检查是否已经生成了代码。然后,这会进入Salesforce对您施加的限制条件限制。如果您不熟悉调控器限制,则基本上意味着您查询数据库的次数过多或进程运行的时间过长,基础系统会抛出调控器限制错误。随机代码的创建带来了不确定性,即查找与先前创建的代码不冲突的代码需要进行多少次查询。因此,现在基本上可以归结为创建保证永不重复的代码,这意味着需要按顺序创建它们。顺序方法的问题在于代码易于猜测。
是的,我可以有一个非Salesforce数据存储区,它可以充当记录源,并采用随机方法进行冲突检查,但是我想看看全球社区是否有任何想法可以工作。我试图找到一种弱对称加密算法,该算法可以产生8个字符的密码,但到目前为止我还没有运气。
答案 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?