类似于Youtube的ID,使用标识符进行相应更改

时间:2014-09-23 05:19:47

标签: php mysql random youtube

我在考虑如何制作一个生成small function YouTube的{​​{1}},如ID并且不会导致碰撞。字符集应该是A-Za-z0-9-_,并且我可以说我希望它10 characters长,等于64 ^ 10 / Quadrillion - 1153 Quadrillion种可能性。

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

从某种意义上说,它不一定是secure我们并不介意是否很容易将其转换回ID作为局外人。但它不应该是这样的模式:

aaaaaaaaaa aaaaaaaaab aaaaaaaaac

我知道你理论上可以制作一个charset并随机循环,直到你有10个随机字符,但这可能会发生碰撞(我发现这个机会很小,你可以执行一个查询看看之前是否已生成key,但我希望将依赖关系保持在最低限度,而不是依赖于SQL)。

我还可以设想在charset中制作100 characters 0-99,然后如果random条件不是length of 10,则前置和/或追加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

我认为这会阻止charset,但我没有100 64ID

希望有人可以抛出一些想法。

  • UPDATE1 :以上草图 实际上可能会在以下(及更多)环境中发生碰撞:
  • 如果99A,则并不意味着下一个字符不能chance collide,尽管不太可能;它可能因此990static component: - (

  • UPDATE2 :如果我们在ID之后和random component之前使用charset,我认为它仍然不会发生冲突不属于id: 0 = A$+8 random characters

  • 更新了Sketch(静态组件为$):

id: 1 = B$+8 random characters

id: 99 = _$+8 random characters

id: 990 = _A$+7 random characters

id: 999999999999999999 = _________$

{{1}}

1 个答案:

答案 0 :(得分:0)

与您在此处的其他问题一样Encode/Decode ID Reversal issue您想要的只是将基数为10的ID转换为与10不同的基数...

你可以简单地对它进行base64编码并完成...

如果你想让它看起来像是随机的,那么在...之前转换数字,例如,简单地用静态的60位值xor ...