def unpack_timestamp(packed_unique_id) packed_unique_id[0..3].split('').map { |n| n.ord }.inject(0) { |t,n| t*256+n }/10**6 end def unpack_local(packed_unique_id) packed_unique_id[4..7].split('').map { |n| n.ord }.join('.') end def unpack_pid(packed_unique_id) packed_unique_id[8..11].split('').map { |n| n.ord }.inject(0) { |t,n| t*256+n } end def unpack_counter(packed_unique_id) packed_unique_id[12..13].split('').map { |n| n.ord }.inject(0) { |t,n| t*256+n } end def unpack_thread_index(packed_unique_id) packed_unique_id[14..17].split('').map { |n| n.ord }.inject(0) { |t,n| t*256+n } end def decode(unique_id) packed_unique_id = Base64.decode64(unique_id.tr('-', '/').tr('@', '+')) { :timestamp => unpack_timestamp(packed_unique_id), :local => unpack_local(packed_unique_id), :pid => unpack_pid(packed_unique_id), :counter => unpack_count(packed_unique_id), :thread_index => unpack_thread_index(packed_unique_id) } end