Ruby UUID和唯一性,用于ID

时间:2011-03-16 16:21:28

标签: ruby uuid uniqueidentifier

我需要一个6个字符的字母数字ID,用于我的rails应用程序,它将呈现给系统的用户,并且在我的系统中的所有对象实例中必须是唯一的。我不指望有超过几千个对象实例,所以6个字符远远超过我真正需要的。

此时我在我的Rails应用程序中使用UUIDTools gem来生成一个uuid。我应该使用哪种UUIDTools生成方法,以及结果uuid的哪一端应该从中获取6个字符,以保证唯一性?

例如,如果我生成ef1cf087-95c9-4868-bd95-cea950a52b58,我是想从前面使用ef1cf0还是从后端使用a52b58

...作为旁注/问题:我是否会这样做?有更好的方法吗?

2 个答案:

答案 0 :(得分:6)

没办法。 UUID被认为是唯一的,因为它很长并且实际上不可能生成相同的UUID。如果你把它修剪成6个字符,那么你就会大大增加重复的可能性。您必须使用递增ID或完整UUID。

只有确定性生成(id(x + 1) = id(x) + 1)才能保证唯一性。 UUID不保证,6个字符保证更少。

其他选项是创建ID生成服务,它将具有单个方法getNewId,并将保留将提供唯一ID的知识。 (最简单的案例 - 柜台)

答案 1 :(得分:3)

如果您说增加ID不是一个选项,那是因为您不希望用户看到您正在使用的方案,或者因为生成必须是无状态的(即,您无法跟踪您生成的所有ID?)

如果是前者,那么您可以生成ID,检查您是否已经使用过它,如果是,则生成另一个新ID。 (如果我走错了轨道,看起来很明显很抱歉。)你可以这样做:

while id = rand(2**256).to_s(36)[0..5] 
   break unless Ids.exists?(id)
end

其中Ids.exists?(id)是已存在的方法。