我需要生成6个字符长度(字母和数字)id来标识SaaS工作区(每个用户唯一)。当然,我可以使用数字,但它不应该提供关于真实工作空间编号的任何清晰视野(对于最终用户)。
因此即使对于id 1,它应该是6个字符长度,类似fX8gz6
并且可以完全解码为1
或000001
或者我可以解析为实际工作空间id的东西。当然,它必须是防碰撞的。
最好的方法是什么?
答案 0 :(得分:0)
这类似于亚马逊用于其云资产的东西,但它使用8个字符。实际上8个字符是合适的,因为它是6个二进制字节的Base64编码之后的输出范围。
假设您可以灵活地使用8个字符。在最初的问题中你说了六个字符,但又一次假设。这是一个可能的方案:
Unsigned Int32
为您的资产编号,可能会自动增加时尚。称之为real-id
。将此real-id用于所有内部用途。real-id-bytes
rand
就可以了。称之为rand-bytes
display-id-bytes
= array-concat(rand-bytes, real-id-bytes)
display-id
= Base64(display-id-bytes)
。这恰好是8个字符长,混合了小写,大写和数字。现在你有一个看似随机的8个字符display-id
,可以映射到real-id
。要转换回来:
display-id
display-id-bytes
强> = Base64Decode(display-id)
real-id-bytes
强> = Discard-the-2-random-bytes-from(display-id-bytes)
real-id
强> = fromBytesToInt32(real-id-bytes)
简单。现在,如果你真的不能去8-char display-id那么你必须开发一些自定义base-64像algo。您也可以将自己限制为仅1个随机字节。另请注意,这只是一种编码方案,而不是加密方案。因此,任何了解您的方案的人都可以有效地破解/解码ID。你需要决定这是否可以接受。如果没有,那么我猜你必须做某种形式的加密。无论如何,6个字符肯定是不够的。