有点奇怪的想法。为什么不使用排列?例如,当您生成第一个 id 时,您有一组值 [0-9a-z]。您按字典顺序进行第一次排列。然后是第二个,依此类推。为了使它看起来不那么容易猜测,您可以更改字典顺序的规则。说“a”在“t”或类似的东西之后。您也可以使用元组而不是完整排列。这将确保没有碰撞。
这个想法实际上是关于制作某种双向哈希函数。基本上,如果您能够以某种方式对数字“1”进行编码以获得类似“q8d3dw”的内容,并且能够将“q8d3dw”解码回“1”,那么您可以确定此函数将为您提供所有值的唯一字符串从 1 到 36^6。
问题实际上是选择这个功能。简单的方法是将“1”关联到“000000”,将“2”关联到“000001”,将“12”关联到“00000b”。基本上按字典顺序排列所有可用的字符串,并在等于 id 的位置上选择字符串。然而,这真的很容易猜到。所以你可以做的是人为地改变字典顺序的规则。说而不是有一个正常的顺序(0,1,2,3...a,b,c...x,y,z),你可以把它洗一下,得到类似的东西(a,5,t,3 ...)。这将产生更模糊的结果。但是它仍然很容易猜测,因为第一个元素是“aaaaaa”,第二个是“aaaaa5”,然后是“aaaaat”。所以你可以进一步改变字典顺序的规则,制作它们取决于角色的位置。说第二个字符 id (a,5,t,3...) 的第一个字符 id (y,7,3,r...) 的顺序,等等。
现在,我不会发布任何伪代码,因为它会很长。而且我不建议你走这条路,除非你有兴趣创建这种有趣的算法:)。但是,如果您使用这条路线,它可能是一种非常有效的生成此 ID 的方法,不会发生冲突。我建议您阅读 Donald Knuth 博士的“计算机编程艺术”第 4 卷。在实现此类算法方面有很多建议。