我需要一个6个字符的字母数字ID,用于我的rails应用程序,它将呈现给系统的用户,并且在我的系统中的所有对象实例中必须是唯一的。我不指望有超过几千个对象实例,所以6个字符远远超过我真正需要的。
此时我在我的Rails应用程序中使用UUIDTools gem来生成一个uuid。我应该使用哪种UUIDTools生成方法,以及结果uuid的哪一端应该从中获取6个字符,以保证唯一性?
例如,如果我生成ef1cf087-95c9-4868-bd95-cea950a52b58
,我是想从前面使用ef1cf0
还是从后端使用a52b58
?
...作为旁注/问题:我是否会这样做?有更好的方法吗?
答案 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)
是已存在的方法。