今天我遇到了一个有趣的问题,搜索了互联网寻找解决方案,但没有找到。这个问题是:
用户创建一个账户,他会得到一个唯一的ID号,比如123,来代表他的账户。当另一个用户创建一个账户时,我可以将最近创建的ID号加1并分配给他,124。然而,这并不能完全匿名化所有人,因为他现在知道用户123在他之前注册。这是一个非常小的问题,但在某些情况下可能会导致更大的问题。
更好的解决方案是使ID号随机但唯一,以便没有人能够知道谁先来。
为了解决这个问题,可以使用标准哈希函数或随机数生成器为每个人创建一个唯一的ID号,但这样可能会出现碰撞。可以通过检查碰撞并再次运行来避免这种情况,但假设对于这个例子来说,这将使系统变得太慢。或者生成器正在运行不完整的信息,无法检查是否存在碰撞。
我想到的另一个想法是基本上有一副洗好的牌,你存储它并在需要新ID号时从顶部拿走一张。当你用完牌堆中的所有牌时,你从上一个牌堆中的最高牌继续,并洗牌那一副牌。这样做的缺点是你必须存储这副牌,如果你不小心丢失了它,你将遇到很多问题,试图重新创建它或在没有它的情况下继续。
一个非常类似的解决方案是每次基于固定种子重新创建这个洗好的牌,并取代替顶部的第n张牌。这种方法的问题是每次需要新卡片时重新洗牌可能会很昂贵。
我尝试想出的其他数学模型都有一个问题,即序列中的下一个数字是可预测的(每个数字与上一个数字相差一个固定的数量)。很多模型也存在碰撞的问题。
所以我的问题是:是否有一些数学模型可以插入数字来获得唯一的ID号,而不需要使用存储在内存中的“牌堆”(读:数组)或在每个函数调用上重新计算。
例如
用户创建一个账户,他会得到一个唯一的ID号,比如123,来代表他的账户。当另一个用户创建一个账户时,我可以将最近创建的ID号加1并分配给他,124。然而,这并不能完全匿名化所有人,因为他现在知道用户123在他之前注册。这是一个非常小的问题,但在某些情况下可能会导致更大的问题。
更好的解决方案是使ID号随机但唯一,以便没有人能够知道谁先来。
为了解决这个问题,可以使用标准哈希函数或随机数生成器为每个人创建一个唯一的ID号,但这样可能会出现碰撞。可以通过检查碰撞并再次运行来避免这种情况,但假设对于这个例子来说,这将使系统变得太慢。或者生成器正在运行不完整的信息,无法检查是否存在碰撞。
我想到的另一个想法是基本上有一副洗好的牌,你存储它并在需要新ID号时从顶部拿走一张。当你用完牌堆中的所有牌时,你从上一个牌堆中的最高牌继续,并洗牌那一副牌。这样做的缺点是你必须存储这副牌,如果你不小心丢失了它,你将遇到很多问题,试图重新创建它或在没有它的情况下继续。
一个非常类似的解决方案是每次基于固定种子重新创建这个洗好的牌,并取代替顶部的第n张牌。这种方法的问题是每次需要新卡片时重新洗牌可能会很昂贵。
我尝试想出的其他数学模型都有一个问题,即序列中的下一个数字是可预测的(每个数字与上一个数字相差一个固定的数量)。很多模型也存在碰撞的问题。
所以我的问题是:是否有一些数学模型可以插入数字来获得唯一的ID号,而不需要使用存储在内存中的“牌堆”(读:数组)或在每个函数调用上重新计算。
例如
randomID(number, seed, range)
randomID(1,123,1000) = 284
randomID(2,123,1000) = 739
randomId(3,123,1000) = 088
randomId(3,888,1000) = 912
我查阅了https://code.google.com/p/smhasher/wiki/MurmurHash3,这看起来很有前途,但我认为它不适用于任意范围的数字,只适用于32位或64位。