【问题标题】:Generating a short UUID string using uuidtools In Rails在 Rails 中使用 uuidtools 生成短 UUID 字符串
【发布时间】:2013-01-07 12:46:03
【问题描述】:

我必须生成一个要存储在数据库中的唯一且随机的字符串。为此,我使用了“uuidtools”gem。然后在我的控制器中,我添加了以下行:

require "uuidtools"

然后在我的控制器创建方法中,我声明了一个“临时”变量并生成一个唯一且随机的“uuid”字符串,如下所示:

temp=UUIDTools::UUID.random_create

它正在创建一个像这样的字符串:

f58b1019-77b0-4d44-a389-b402bb3e6d50

现在我的问题是我必须缩短它,最好在 8-10 个字符内。现在我该怎么做??是否可以传递任何参数以使其成为理想长度的字符串?

在此先感谢...

【问题讨论】:

    标签: ruby ruby-on-rails-3 uuid


    【解决方案1】:

    您不需要 uuidtools。您可以为此使用Secure Random

    [1] pry(main)> require "securerandom"
    => true
    [2] pry(main)> SecureRandom.hex(20)
    => "82db4d707c4c5db3ebfc349da09c991b7ca0faa1"
    [3] pry(main)> SecureRandom.base64(20)
    => "CECjUqNvPBaq0o4OuPy8RvsEoCY="
    

    45 传递给hex 将分别生成8 个和10 个字符的十六进制字符串。

    [5] pry(main)> SecureRandom.hex(4)
    => "a937ec91"
    [6] pry(main)> SecureRandom.hex(5)
    => "98605bb20a"
    

    【讨论】:

    • 我是 Rails 和 Ruby 的新手。我用 SecureRandom 试过了。但实际上我无法弄清楚如何在我的控制器中实际实现此方法。我的意思是要包含在我的控制器中的内容以及要下载的内容等。
    • @Siddharth,无需下载,只需在使用此方法之前添加require 'securerandom'。这是在 Ruby 1.9.3 的标准库中。
    • SecureRandom 实际上有一个#uuid 方法,可以生成符合 RFC 4122 的 UUID。
    • @Siddharth 的要求之一是唯一性。我很确定#hex#base64 方法只能保证随机性。正如@Duke 所说,#uuid 是更好的选择。
    【解决方案2】:

    请详细看一下,我最近在我的一个项目中如何使用securerandom,绝对对你有帮助!

    在你的 lib/usesguid.rb 中创建 usesguid.rb 文件并将下面的代码粘贴到其中 -

    require 'securerandom'
    
    module ActiveRecord
      module Usesguid #:nodoc:
        def self.append_features(base)
          super
          base.extend(ClassMethods)  
        end
    
        module ClassMethods
          def usesguid(options = {})
            class_eval do
              self.primary_key = options[:column] if options[:column]
              after_initialize :create_id
              def create_id
                self.id ||= SecureRandom.uuid
              end
            end
          end
        end
      end
    end
    ActiveRecord::Base.class_eval do
      include ActiveRecord::Usesguid
    end
    

    在 config/application.rb 中添加以下行以加载文件 -

    require File.dirname(__FILE__) + '/../lib/usesguid'
    

    为 UUID 函数创建迁移脚本,如下所述 -

    class CreateUuidFunction < ActiveRecord::Migration
      def self.up
        execute "create or replace function uuid() returns uuid as 'uuid-ossp', 'uuid_generate_v1' volatile strict language C;"
      end
    
      def self.down
        execute "drop function uuid();"
      end
    end
    

    这是联系人迁移的示例,我们如何使用它 -

    class CreateContacts < ActiveRecord::Migration
      def change
        create_table :contacts, id: false do |t|
          t.column :id, :uuid, null:false 
          t.string :name
          t.string :mobile_no
    
          t.timestamps
        end
      end
    end
    

    最终如何使用到你的模型中

    class Contact < ActiveRecord::Base
      usesguid
    
    end
    

    这将帮助您为 Rails 应用程序配置 UUID。

    这对于 Rails 3.0、3.1、3.2 和 4.0 也很有用。

    如果您在使用时遇到任何问题,请告诉我,很简单!

    【讨论】:

      猜你喜欢
      • 2020-07-30
      • 2012-01-30
      • 2011-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-24
      • 1970-01-01
      相关资源
      最近更新 更多