在我正在处理的项目中,我需要生成16个字符长的唯一ID,由10个数字和26个大写字母组成(只有大写字母)。必须保证它们具有普遍的独特性,并且不会有重演的机会。将唯一的16位数字ID映射到唯一的字母数字ID
这些ID不会永久存储。经过一段时间后,ID会从数据库中抛出,并且必须生成新的唯一ID。身份证不能重复扔出去的人。
因此,随机生成16位数字并检查先前生成的ID列表不是一种选择,因为没有全面的先前ID列表。另外,UUID
将不起作用,因为ID必须是16位数字。
现在我正在使用16位唯一ID,它们在每次生成时都保证是通用唯一的(我使用timestamps
生成它们以及唯一的服务器ID)。不过,我需要的ID很难预测,并且使用timestamps
可以很容易地预测。
因此,我需要做的是将我有的16位数字ID映射到更大范围的10位数字+ 26个字母而不会失去唯一性。我需要某种散列函数,从一个较小的范围,以一个更大的范围映射,保证一个一对一的映射,使得唯一ID是保证被映射后留独特的。
我已经搜查,到目前为止还没有发现,保证是无冲突的任何哈希或映射功能,但如果我映射到一个更大的空间,一个必须存在。任何建议表示赞赏。
保证当你不存储以前的这些问题时具有普遍独特性,这会造成问题。任何关于您一生中期望生成多少个ID的想法?例如,如果您使用mac地址和时间戳,并使用AES加密对其进行加密,则使用base-64对其进行编码,并采用可能有效的每个其他字母或数字。但是,它不能保证是唯一的。 –
那么16位数时间戳+服务器ID保证在世代时是通用唯一的,而不是根据列表进行检查,问题是将其映射到更大的范围以使其“模糊化”而不会失去唯一性。你对AES加密的建议会带走唯一性,所以我不能使用它。 – watermelon82
如何确保两个16位ID不会重复,如果它们是由同一服务器上的两个线程在同一时刻生成的? –