我在考虑如何制作一个生成类似YouTube
的ID
并且不会引起冲突的small function
。字符集应该是A-Za-z0-9-_
,比方说我希望它是10 characters
长,这将等于64 ^ 10 / Quadrillion
-1153 Quadrillion
的可能性。
small
非常重要,因为它是网站的主要功能之一,应该足够清晰,可以轻松修改。在发生紧急情况的几秒钟内。
它不一定是secure
,因为我们并不介意作为局外人是否很容易转换回ID
。然而,它不应该是这样的模式:
aaaaaaaaaa
aaaaaaaaab
aaaaaaaaac
我知道理论上你可以制作一个charset
并随机循环,直到你有了10
个随机字符,但这可能会发生冲突(我意识到这个机会很小,你可以执行一个查询,看看key
以前是否生成过,但我希望将依赖性保持在最低限度,它不依赖于SQL
)。
我还可以想象,如果不满足length of 10
条件,则将100 characters
作为0-99
中的charset
,然后前置和/或附加random
字符。例如:
-
重要:下面的场景假设
A
是集合中的第一个字符,_
是最后一个字符
id: 0 = A+9 random characters
id: 1 = B+9 random characters
id: 99 = _+9 random characters
id: 990 = _A+8 random characters
id: 99999999999999999999 = __________
我认为这会阻止collisions
,但我没有100
的charset
,而是64
。
希望有人能提出一些想法。
- 更新1:上述草图可能在以下(以及更多)情况下发生碰撞:
-
如果
ID
是99
,这并不意味着下一个字符不能由chance
变成A
,尽管可能性很小;因此CCD_ 38与CCD_ 39:-( -
UPDATE2:如果我们在
ID
之后和random component
之前使用不属于charset
的static component
,我认为它不会发生冲突。 -
更新的草图(静态组件为$):
id: 0 = A$+8 random characters
id: 1 = B$+8 random characters
id: 99 = _$+8 random characters
id: 990 = _A$+7 random characters
id: 999999999999999999 = _________$
就像你在这里的另一个问题一样,编码/解码ID反转问题,你想要的只是将你的ID从基数10转换为不同于基数10的ID。。。
你可以简单地对它进行base64编码,然后完成。。。
如果你想让它看起来像随机的,在。。。例如,简单地将其与静态60位值异或。。。