这里有两个想法:
- 使用可逆哈希。这是否有效取决于您认为的安全性,因为它本质上只是混淆。但是如果你定制它(也许改变算法中某些步骤的顺序),并且你防止源被泄露,它将阻止除了最坚定的攻击者之外的所有攻击者。(根据您的安全目标,您可能希望结合其他一些技术来降低泄漏风险,例如,员工离开公司。考虑将部分算法保密,就好像它是加密密钥一样,并且对输入进行额外的、可变的、预转换。)
在我的脑海中,一个简单的可逆哈希可能只是位的“横向添加”。对于更复杂的东西,我想不到,流行的“MurmurHash”系列算法据称是可逆的。
我不知道有任何密码学上强大的可逆哈希。但是,关于对称加密主题的其他答案与此想法相似。
- 使用流密码,AKA 加密 RNG。如果订单总数将相当小,这是合适的。您需要的是一个唯一的数字序列,它与计数序列一一对应。因此,使用您选择的 RC4 或 HMAC 生成一系列唯一随机数,并在执行过程中消除重复项。(也许让这个过程快速进行的一种创造性方法是布隆过滤器。)
对于从内部 ID 到外部 ID 的映射,您只需生成序列。反过来,您继续前进,直到找到 ID,或达到最大订单 ID。这个算法是 O(n),这显然不是理想的,但如果你愿意妥协一点,增加更多的复杂性,或者聪明一点,你可能会找到一种方法来缓解这种情况。例如,您可以在 RAM 中保留 ID 的缓存。
编辑:
由于线性复杂性,我自己对 #2 持怀疑态度,所以我运行了一些数字。使用来自 Core2 处理器的 Crypto++ 基准数字,如果您将 10 毫秒的预算用于数字转换,并且您使用 40 位 ID(假设您获得了 1 万亿次订单),您将获得最大约 2,500,000 的订单 ID。而且我认为您可以使用较小的密钥将其翻倍。
所以这种方法可以采用任何一种方式。对于小规模的东西,这很好。(上面的假设是保守的。)但是对于大规模的东西,这可能是一个烦恼。这足以让您完成产品发布;在您开始谈论如何将软件构建为分布式系统时,您可能想重新审视它,这也将有助于解决这个问题。但到那时,你最好质疑最初的假设,然后将这个东西存储在某个数据库中。