Object
UUID format version 1, as specified in RFC 4122, with jitter in place of the mac address and sequence counter.
# File lib/simple_uuid.rb, line 23 def initialize(bytes = nil, opts = {}) case bytes when self.class # UUID @bytes = bytes.to_s when String case bytes.size when 16 # Raw byte array @bytes = bytes when 36 # Human-readable UUID representation; inverse of #to_guid elements = bytes.split("-") raise TypeError, "Expected #{bytes.inspect} to cast to a #{self.class} (malformed UUID representation)" if elements.size != 5 @bytes = [elements.join].pack('H32') else raise TypeError, "Expected #{bytes.inspect} to cast to a #{self.class} (invalid bytecount)" end when Integer raise TypeError, "Expected #{bytes.inspect} to cast to a #{self.class} (integer out of range)" if bytes < 0 or bytes > 2**128 @bytes = [ (bytes >> 96) & 0xFFFF_FFFF, (bytes >> 64) & 0xFFFF_FFFF, (bytes >> 32) & 0xFFFF_FFFF, bytes & 0xFFFF_FFFF ].pack("NNNN") when NilClass, Time time = (bytes || Time).stamp * 10 + GREGORIAN_EPOCH_OFFSET # See http://github.com/spectra/ruby-uuid/ byte_array = [ time & 0xFFFF_FFFF, time >> 32, ((time >> 48) & 0x0FFF) | 0x1000, ] # Top 3 bytes reserved if opts[:randomize] == false byte_array += [ 0 | VARIANT, 0, 0 ] else byte_array += [ rand(2**13) | VARIANT, rand(2**16), rand(2**32) ] end @bytes = byte_array.pack("NnnnnN") else raise TypeError, "Expected #{bytes.inspect} to cast to a #{self.class} (unknown source class)" end end
Given raw bytes, return a time object
# File lib/simple_uuid.rb, line 143 def self.to_time(bytes) usecs = total_usecs(bytes) Time.at(usecs / 1_000_000, usecs % 1_000_000) end
Given raw bytes, return the total_usecs
# File lib/simple_uuid.rb, line 154 def self.total_usecs(bytes) elements = bytes.unpack("Nnn") (elements[0] + (elements[1] << 32) + ((elements[2] & 0x0FFF) << 48) - GREGORIAN_EPOCH_OFFSET) / 10 end
# File lib/simple_uuid.rb, line 111 def <=>(other) total_usecs <=> other.send(:total_usecs) end
# File lib/simple_uuid.rb, line 115 def ==(other) to_s == other.to_s end
# File lib/simple_uuid.rb, line 138 def eql?(other) other.respond_to?(:bytes) && bytes == other.bytes end
# File lib/simple_uuid.rb, line 119 def inspect(long = false) "<UUID##{object_id} time: #{ to_time.inspect }, usecs: #{ usecs } jitter: #{ @bytes.unpack('QQ')[1] }" + (long ? ", version: #{version}, variant: #{variant}, guid: #{to_guid}>" : ">") end
# File lib/simple_uuid.rb, line 103 def seconds total_usecs / 1_000_000 end
# File lib/simple_uuid.rb, line 96 def to_guid elements = @bytes.unpack("NnnCCa6") node = elements[-1].unpack('C*') elements[-1] = '%02x%02x%02x%02x%02x%02x' % node "%08x-%04x-%04x-%02x%02x-%s" % elements end
# File lib/simple_uuid.rb, line 78 def to_i ints = @bytes.unpack("NNNN") (ints[0] << 96) + (ints[1] << 64) + (ints[2] << 32) + ints[3] end
# File lib/simple_uuid.rb, line 129 def to_s @bytes end
Return a time object
# File lib/simple_uuid.rb, line 149 def to_time Time.at(total_usecs / 1_000_000, total_usecs % 1_000_000) end
# File lib/simple_uuid.rb, line 107 def usecs total_usecs % 1_000_000 end
Generated with the Darkfish Rdoc Generator 2.