我目前正在开发一个注册系统原型。它非常简单,本质上只是一个写入MongoDB的.NET表单。
我所坚持的是一种为每个用户生成唯一id/key的有效方法。这些ids必须是人类友好的,所以类似于7个字符长度的字母数字字符串,例如A1B2C3X。
到目前为止,我看到的解决方案只是使用一个简单的函数生成一个随机字符串,然后检查数据库以查看它是否是唯一的(如果不是,重复执行,直到找到唯一的字符串)。当然,随着数据库条目数量的增加,这将在计算上变得越来越昂贵。
我的想法是预先计算唯一的id集,并将其存储在另一个数据库中。然后,当我需要将一个新条目添加到用户数据库中时,我可以从我的id数据库中“弹出”一个id (以恒定的时间),并且知道它还不存在于用户数据库中,而不需要搜索它。
我敢肯定以前一定有人做过这样的事情。有没有更好的方法?我不知道为什么我会在这件事上苦苦挣扎。非常感谢您的意见。
发布于 2012-03-11 22:01:55
在应用程序中生成一个随机字符串并检查它是否唯一是一个不错的解决方案。不要担心它的低效,它不是--而且绝对不是与其他替代方案相比。这肯定比运行db.user.count()或使用预先计算的It保存一个单独的表更快。你只需要做好这件事。
首先,创建新用户的频率是多少?与其他事情相比,可能不是很常见,所以实际上整个效率讨论都是没有意义的。其次,有7个字符A-Z,0-9的范围是36^7或大约780亿。至少可以说,在你开始看到碰撞之前,还需要一段时间。
如果你只是这样做,它不会导致任何性能损失,除非有冲突(这是非常不可能的):
_idgetLastError命令)。重新开始
这样一来,只有在发生冲突的情况下才会有额外的工作(我真的,真的想强调一下,这是多么难以置信的不可能)。
还有另一种生成惟一用户ID的方法:获取当前的UNIX时间戳(精确到秒),附加主机名的散列,然后是进程ID,最后是计数器的当前值。事实上,这就是Mongo的ObjectId是如何生成的,并保证您可以在每个进程中每秒生成与您的计数器的最大值一样多的对象(在Mongo中是3字节,所以是1600万)。如果您对详细信息感兴趣,请参阅ObjectId上的文档:http://www.mongodb.org/display/DOCS/Object+IDs
它的属性是您的用户ID将自然地按创建顺序排序,但它是12字节长,所以不幸的是比您的7个字符要长一点。您可以使用相同的方法,跳过主机名/pid,并将计数器(如果您喜欢,也可以是随机数)缩短为两个字节,然后您将减少到6个字节,这可能会被压缩为大约9个字符A-Z,0-9。
https://stackoverflow.com/questions/9654981
复制相似问题