def self.uuid(string=nil)
string ||= OpenSSL::Random.random_bytes(16).unpack('H*').shift
uuid_name_space_dns = [0x6b, 0xa7, 0xb8, 0x10, 0x9d, 0xad, 0x11, 0xd1, 0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8].map {|b| b.chr}.join
sha1 = Digest::SHA1.new
sha1.update(uuid_name_space_dns)
sha1.update(string)
bytes = sha1.digest[0, 16].bytes.to_a
bytes[6] &= 0x0f
bytes[6] |= 0x50
bytes[8] &= 0x3f
bytes[8] |= 0x80
bytes = [4, 2, 2, 2, 6].collect do |i|
bytes.slice!(0, i).pack('C*').unpack('H*')
end
bytes.join('-')
end