Appearance
Generate UUID in Ruby
Ruby provides built-in UUID generation through the SecureRandom
module. The simplest way to generate a UUID version 4 is:
ruby
require 'securerandom'
# Generate UUID version 4 - random
uuid = SecureRandom.uuid
puts "Generated UUID: #{uuid}"
# Alternative method
uuid_alt = SecureRandom.random_bytes(16).unpack('H*')[0].gsub(/(.{8})(.{4})(.{4})(.{4})(.{12})/, '\1-\2-\3-\4-\5')
puts "Alternative UUID: #{uuid_alt}"
For generating specific UUID versions, you can use the uuid gem which offers comprehensive UUID support:
ruby
require 'uuidtools'
# Generate UUID version 1 - time based
uuid1 = UUIDTools::UUID.timestamp_create
puts "UUID v1: #{uuid1}"
# Generate UUID version 3 - deterministic and hashed with MD5
namespace = UUIDTools::UUID_URL_NAMESPACE
uuid3 = UUIDTools::UUID.md5_create(namespace, 'https://example.com')
puts "UUID v3: #{uuid3}"
# Generate UUID version 4 - random
uuid4 = UUIDTools::UUID.random_create
puts "UUID v4: #{uuid4}"
# Generate UUID version 5 - deterministic and hashed with SHA-1
uuid5 = UUIDTools::UUID.sha1_create(namespace, 'https://example.com')
puts "UUID v5: #{uuid5}"
# Note: v6 and v7 may require additional gems or custom implementation
Installation & Setup
Using Bundler (Gemfile):
ruby
# Gemfile
gem 'uuidtools'
# Then run:
# bundle install
Using gem command:
bash
gem install uuidtools
Rails Integration
ActiveRecord Models:
ruby
# In your migration
class CreateUsers < ActiveRecord::Migration[7.0]
def change
create_table :users, id: :uuid do |t|
t.string :name, null: false
t.string :email, null: false
t.timestamps
end
end
end
# In your model
class User < ApplicationRecord
before_create :set_uuid
private
def set_uuid
self.id = SecureRandom.uuid if id.blank?
end
end
Rails Configuration for UUID Primary Keys:
ruby
# config/application.rb
config.generators do |g|
g.orm :active_record, primary_key_type: :uuid
end
# config/initializers/generators.rb
Rails.application.config.generators do |g|
g.orm :active_record, primary_key_type: :uuid
end
Controller Usage:
ruby
class UsersController < ApplicationController
before_action :set_request_id
def create
@user = User.new(user_params)
@user.id = SecureRandom.uuid
if @user.save
render json: @user, status: :created
else
render json: @user.errors, status: :unprocessable_entity
end
end
private
def set_request_id
request.headers['X-Request-ID'] = SecureRandom.uuid
end
def user_params
params.require(:user).permit(:name, :email)
end
end
Advanced Ruby UUID Usage
Custom UUID Generator Class:
ruby
require 'securerandom'
require 'uuidtools'
class UUIDGenerator
NAMESPACE_URL = UUIDTools::UUID_URL_NAMESPACE
NAMESPACE_DNS = UUIDTools::UUID_DNS_NAMESPACE
class << self
def v1
UUIDTools::UUID.timestamp_create.to_s
end
def v3(name, namespace = NAMESPACE_URL)
UUIDTools::UUID.md5_create(namespace, name).to_s
end
def v4
SecureRandom.uuid
end
def v5(name, namespace = NAMESPACE_URL)
UUIDTools::UUID.sha1_create(namespace, name).to_s
end
def validate(uuid_string)
UUIDTools::UUID.parse(uuid_string)
true
rescue ArgumentError
false
end
def parse(uuid_string)
UUIDTools::UUID.parse(uuid_string)
rescue ArgumentError => e
raise "Invalid UUID format: #{e.message}"
end
end
end
# Usage
puts "UUID v1: #{UUIDGenerator.v1}"
puts "UUID v3: #{UUIDGenerator.v3('example.com')}"
puts "UUID v4: #{UUIDGenerator.v4}"
puts "UUID v5: #{UUIDGenerator.v5('example.com')}"
# Validation
uuid = UUIDGenerator.v4
puts "Valid UUID: #{UUIDGenerator.validate(uuid)}"
Sinatra Integration:
ruby
require 'sinatra'
require 'securerandom'
require 'json'
# Middleware to add request ID
use Rack::CommonLogger
before do
@request_id = SecureRandom.uuid
response.headers['X-Request-ID'] = @request_id
end
get '/api/uuid' do
content_type :json
{
uuid: SecureRandom.uuid,
request_id: @request_id,
timestamp: Time.now.iso8601
}.to_json
end
post '/api/users' do
content_type :json
user_data = JSON.parse(request.body.read)
user = {
id: SecureRandom.uuid,
name: user_data['name'],
email: user_data['email'],
created_at: Time.now.iso8601
}
status 201
user.to_json
end
Background Jobs with Sidekiq:
ruby
require 'sidekiq'
require 'securerandom'
class ProcessUserJob
include Sidekiq::Worker
def perform(user_id)
job_id = SecureRandom.uuid
logger.info "Processing user #{user_id} with job ID #{job_id}"
# Process user logic here
logger.info "Completed job #{job_id}"
end
end
# Usage
ProcessUserJob.perform_async(SecureRandom.uuid)
Testing with RSpec
UUID Testing Helpers:
ruby
# spec/support/uuid_helpers.rb
module UUIDHelpers
def valid_uuid?(uuid)
uuid.match?(/\A[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\z/i)
end
def generate_uuid
SecureRandom.uuid
end
end
RSpec.configure do |config|
config.include UUIDHelpers
end
# spec/models/user_spec.rb
RSpec.describe User, type: :model do
describe 'UUID generation' do
it 'generates a valid UUID on creation' do
user = User.create(name: 'Test User', email: '[email protected]')
expect(valid_uuid?(user.id)).to be true
end
it 'has a unique ID for each user' do
user1 = User.create(name: 'User 1', email: '[email protected]')
user2 = User.create(name: 'User 2', email: '[email protected]')
expect(user1.id).not_to eq(user2.id)
end
end
end
UUID Version Comparison
Choose the right version for your Ruby application:
- Version 1 - Time-based, includes MAC address
- Version 3 - MD5 namespace-based, deterministic
- Version 4 - Random, most popular choice (built-in Ruby support)
- Version 5 - SHA-1 namespace-based, more secure than v3
- Version 6 - Time-ordered, better than v1 for databases
- Version 7 - Modern time-based with improved sorting
For Ruby applications:
- Rails models: Use Version 4 for ActiveRecord primary keys
- Background jobs: Consider Version 7 for job queuing and tracking
- API development: Use Version 5 for deterministic resource IDs
How do I generate UUID in other languages?
Web development:
- JavaScript - crypto.randomUUID() & uuid library
- TypeScript - Type-safe frontend development
- Python - Built-in uuid module
- PHP - Built-in functions & ramsey/uuid
Backend systems: