2012-08-29 69 views
2

我想创建一个模型,该模型具有一个保存基于字符串的唯一标识符的属性。Rails字符串唯一ID

我只想要唯一的字符串是3个字符长,由字母(仅限小写字母)和数字组成。

我该如何实现类似上述的东西?我如何避免碰撞?我研究了MD5,这似乎与我想要完成的内容相符 - 但更短。如果这使得这种方法具有确定性,我也愿意在一段时间内种下它。

我很想关于这个主题的任何反馈或指针。谢谢!

编辑: 一个解决方案,一直在我的脑海中创建一个表满每一个置换,然后随机从表中需要选择和删除使用一次。这是一个坏方法吗?

+0

3个字符似乎有点乐观。你为什么需要这么短,而且只有字母? –

+0

这只适用于您希望数据库中永远不会超过46656条记录的情况。此外,你是否想要随机生成标识符,或者你可以简单地从'aaa','aab','aac'开始...... – meagar

+0

嗯,我认为我从3个字符开始,并根据需要将其碰撞。用户需要在邮寄地址中使用这些字符,所以越短越好。身份不应该是可预测的,而应该是随机的。 – aren55555

回答

1

看看这个SO thread;它有很多好的建议。特别是Simone Carletti的最后回答,指向这个post

在上面的帖子中有很多选项。我很喜欢,而且可能对您有用的一个是利用rufus-mnemo gem

+0

我看过那篇文章,但是解决方案:'rand(36 ** 8).to_s(36)'有点担心碰撞。 – aren55555

+0

正如@meagar指出的那样,你对UID的大小限制太薄了,你将会使用一些机制来检查冲突(例如:生成一个密钥并检查它是否已经存在)。如果你想避免那扩大尺寸限制。 – rb512

0

所以我决定读一些问题&答案后推出的解决方案比任何人有什么建议有很大的不同。

我创建了一个表来存储代码。我写了一个红宝石脚本来填充这张表,每个字母组合都是基于我想要使用的字符。然后在我的模型中,如果代码尚未分配,我有一个before_save方法将代码分配给实例。

这种方法可以确保在before_save中分配代码时我永远不会碰撞。最慢的部分是桌子的一代,但因为我只需要处理这一点就可以做到这一点。