Generating unique random string for identifying a record
我需要能够通过唯一键识别表中的记录,在本例中为用户表,该键不会泄露表中记录的顺序。
目前我有主键字段,生成的路由如下:
1 | /users/1 |
但是,我希望能够生成如下路线:
1 | /users/kfjslncdk |
我可以在路由端、数据库端等连接所有东西。但我不确定在 rails 中生成唯一字符串标识符的最佳方法是什么。我想做类似的事情:
1 2 3 4 5 | before_save :create_unique_identifier def create_unique_identifier self.unique_identifier = ... magic goes here ... end |
我想我可以使用使用 UUIDTools 创建的 guid 的第一部分,但我需要在保存用户之前检查以确保它是唯一的。
任何建议将不胜感激!
1 2 3 4 5 6 7 8 | before_create :create_unique_identifier def create_unique_identifier loop do self. unique_identifier = SecureRandom.hex(5) # or whatever you chose like UUID tools break unless self.class.exists?(:unique_identifier => unique_identifier) end end |
Ruby 1.9 包含一个内置的 UUID 生成器:
- uuid
- uuid工具
- 如何在 Ruby 中创建小而独特的令牌
省去存储混淆 id 的麻烦,只需使用 base 62 (a-z, A-Z, 0-9) 对 id 进行编码,但自定义定义"数字"的顺序。这将使计算顺序变得非常复杂。
我曾经写过一些可以做到这一点的类(可能需要一些重构):https://gist.github.com/4058176
另一种可能是使用
示例:
1 2 3 4 5 6 | def generate_identifier begin uid = SecureRandom.base64(8) end while self.class.exists?(uid: uid) self.uid = uid end |