60 if ((mode & QUuid::WithoutBraces) == 0)
62 _q_toHex(dst, uuid.data1);
63 if ((mode & QUuid::Id128) != QUuid::Id128)
65 _q_toHex(dst, uuid.data2);
66 if ((mode & QUuid::Id128) != QUuid::Id128)
68 _q_toHex(dst, uuid.data3);
69 if ((mode & QUuid::Id128) != QUuid::Id128)
71 for (
int i = 0; i < 2; i++)
72 _q_toHex(dst, uuid.data4[i]);
73 if ((mode & QUuid::Id128) != QUuid::Id128)
75 for (
int i = 2; i < 8; i++)
76 _q_toHex(dst, uuid.data4[i]);
77 if ((mode & QUuid::WithoutBraces) == 0)
93static QUuid _q_uuidFromHex(
const char *src)
102 if (Q_LIKELY( _q_fromHex(src, d1)
104 && _q_fromHex(src, d2)
106 && _q_fromHex(src, d3)
108 && _q_fromHex(src, d4[0])
109 && _q_fromHex(src, d4[1])
111 && _q_fromHex(src, d4[2])
112 && _q_fromHex(src, d4[3])
113 && _q_fromHex(src, d4[4])
114 && _q_fromHex(src, d4[5])
115 && _q_fromHex(src, d4[6])
116 && _q_fromHex(src, d4[7]))) {
117 return QUuid(d1, d2, d3, d4[0], d4[1], d4[2], d4[3], d4[4], d4[5], d4[6], d4[7]);
124static QUuid createFromName(QUuid ns, QByteArrayView baseData, QCryptographicHash::Algorithm algorithm,
int version)
noexcept
126 std::byte buffer[20];
127 Q_ASSERT(
sizeof buffer >= size_t(QCryptographicHash::hashLength(algorithm)));
128 QByteArrayView hashResult
129 = QCryptographicHash::hashInto(buffer, {QByteArrayView{ns.toBytes()}, baseData}, algorithm);
130 Q_ASSERT(hashResult.size() >= 16);
131 hashResult.truncate(16);
133 QUuid result = QUuid::fromRfc4122(hashResult);
135 result.data3 &= 0x0FFF;
136 result.data3 |= (version << 12);
137 result.data4[0] &= 0x3F;
138 result.data4[0] |= 0x80;
722QByteArray QUuid::toByteArray(QUuid::StringFormat mode)
const
724 QByteArray result(MaxStringUuidLength, Qt::Uninitialized);
725 const auto end = _q_uuidToHex(*
this,
const_cast<
char *>(result.constData()), mode);
726 result.resize(end - result.constData());
777QDataStream &operator<<(QDataStream &s,
const QUuid &id)
779 constexpr int NumBytes =
sizeof(QUuid);
780 static_assert(NumBytes == 16,
"Change the serialization format when this ever hits");
781 char bytes[NumBytes];
782 if (s.byteOrder() == QDataStream::BigEndian) {
783 const auto id128 = id.toBytes();
784 static_assert(
sizeof(id128) == NumBytes);
785 memcpy(bytes, &id128, NumBytes);
792 qToLittleEndian(id.data1, data);
793 data +=
sizeof(quint32);
794 qToLittleEndian(id.data2, data);
795 data +=
sizeof(quint16);
796 qToLittleEndian(id.data3, data);
797 data +=
sizeof(quint16);
799 for (
int i = 0; i < 8; ++i) {
800 *(data) = id.data4[i];
805 if (s.writeRawData(bytes, NumBytes) != NumBytes)
806 s.setStatus(QDataStream::WriteFailed);
817 std::array<
char, 16> bytes;
818 if (s.readRawData(bytes.data(), 16) != 16) {
819 s.setStatus(QDataStream::ReadPastEnd);
823 if (s.byteOrder() == QDataStream::BigEndian) {
824 id = QUuid::fromRfc4122(bytes);
826 const uchar *data =
reinterpret_cast<
const uchar *>(bytes.data());
828 id.data1 = qFromLittleEndian<quint32>(data);
829 data +=
sizeof(quint32);
830 id.data2 = qFromLittleEndian<quint16>(data);
831 data +=
sizeof(quint16);
832 id.data3 = qFromLittleEndian<quint16>(data);
833 data +=
sizeof(quint16);
835 for (
int i = 0; i < 8; ++i) {
836 id.data4[i] = *(data);
950QUuid QUuid::createUuid()
952 QUuid result(Qt::Uninitialized);
953 uint *data = &(result.data1);
954 enum { AmountToRead = 4 };
955 QRandomGenerator::system()->fillRange(data, AmountToRead);
957 result.data4[0] = (result.data4[0] & 0x3F) | 0x80;
958 result.data3 = (result.data3 & 0x0FFF) | 0x4000;