类似Youtube的ID会随着标识符而相应变化


Youtube-like IDs that change accordingly with an indentifier

我在考虑如何制作一个生成类似YouTubeID并且不会引起冲突的small function。字符集应该是A-Za-z0-9-_,比方说我希望它是10 characters长,这将等于64 ^ 10 / Quadrillion-1153 Quadrillion的可能性。

small非常重要,因为它是网站的主要功能之一,应该足够清晰,可以轻松修改。在发生紧急情况的几秒钟内。

它不一定是secure,因为我们并不介意作为局外人是否很容易转换回ID。然而,它不应该是这样的模式:

aaaaaaaaaaaaaaaaaaabaaaaaaaaac

我知道理论上你可以制作一个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,但我没有100charset,而是64

希望有人能提出一些想法。

  • 更新1:上述草图可能在以下(以及更多)情况下发生碰撞:
  • 如果ID99,这并不意味着下一个字符不能由chance变成A,尽管可能性很小;因此CCD_ 38与CCD_ 39:-(

  • UPDATE2:如果我们在ID之后和random component之前使用不属于charsetstatic 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位值异或。。。