diff options
author | samantharitter <samantha.ritter@10gen.com> | 2017-03-21 09:55:24 -0400 |
---|---|---|
committer | samantharitter <samantha.ritter@10gen.com> | 2017-03-22 15:18:40 -0400 |
commit | e15d99fc1bb2b4010a3f1cdb2dfef15259f46f45 (patch) | |
tree | 6f37f962d3376d0f11cd4a878c7ed24364c257d1 /src/mongo/util/uuid.h | |
parent | 34dcbcb6688729e20cf817d030460784dd2d32cb (diff) | |
download | mongo-e15d99fc1bb2b4010a3f1cdb2dfef15259f46f45.tar.gz |
SERVER-28294 Add a standalone UUID library to utilities
Diffstat (limited to 'src/mongo/util/uuid.h')
-rw-r--r-- | src/mongo/util/uuid.h | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/src/mongo/util/uuid.h b/src/mongo/util/uuid.h new file mode 100644 index 00000000000..5127932dd6a --- /dev/null +++ b/src/mongo/util/uuid.h @@ -0,0 +1,126 @@ +/** + * Copyright (C) 2017 MongoDB Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * As a special exception, the copyright holders give permission to link the + * code of portions of this program with the OpenSSL library under certain + * conditions as described in each individual source file and distribute + * linked combinations including the program with the OpenSSL library. You + * must comply with the GNU Affero General Public License in all respects for + * all of the code used other than as permitted herein. If you modify file(s) + * with this exception, you may extend this exception to your version of the + * file(s), but you are not obligated to do so. If you do not wish to do so, + * delete this exception statement from your version. If you delete this + * exception statement from all source files in the program, then also delete + * it in the license file. + */ + +#pragma once + +#include <functional> +#include <string> + +#include <third_party/murmurhash3/MurmurHash3.h> + +#include "mongo/base/status_with.h" +#include "mongo/bson/bsonelement.h" +#include "mongo/bson/bsonobj.h" + +namespace mongo { + +/** + * A UUID is a 128-bit unique identifier, per RFC 4122, v4, using + * a secure random number generator. + */ +class UUID { +public: + UUID() = delete; + + /** + * The number of bytes contained in a UUID. + */ + static const int kNumBytes; + + /** + * Generate a new random v4 UUID per RFC 4122. + */ + static UUID gen(); + + /** + * If the given string represents a valid UUID, constructs and returns the UUID, + * otherwise returns an error. + */ + static StatusWith<UUID> parse(const std::string& s); + + /** + * If the given BSONElement represents a valid UUID, constructs and returns the UUID, + * otherwise returns an error. + */ + static StatusWith<UUID> parse(BSONElement from); + + /** + * Returns whether this string represents a valid UUID. + */ + static bool isUUIDString(const std::string& s); + + /** + * Return a BSON object of the form { uuid: BinData(4, "...") }. + */ + BSONObj toBSON() const; + + /** + * Return a string representation of this UUID, in hexadecimal, + * as per RFC 4122: + * + * 4 Octets - 2 Octets - 2 Octets - 2 Octets - 6 Octets + */ + std::string toString() const; + + inline bool operator==(const UUID& rhs) const { + return !memcmp(&_uuid, &rhs._uuid, sizeof(_uuid)); + } + + inline bool operator!=(const UUID& rhs) const { + return !(*this == rhs); + } + + /** + * Custom hasher so UUIDs can be used in unordered data structures. + * + * ex: std::unordered_set<UUID, UUID::Hash> uuidSet; + */ + struct Hash { + std::size_t operator()(const UUID& uuid) const { + uint32_t hash; + MurmurHash3_x86_32(uuid._uuid.data(), UUID::kNumBytes, 0, &hash); + return hash; + } + }; + +private: + using UUIDStorage = std::array<unsigned char, 16>; + UUID(const UUIDStorage& uuid) : _uuid(uuid) {} + + UUIDStorage _uuid; // UUID in network byte order +}; + +inline std::ostream& operator<<(std::ostream& s, const UUID& uuid) { + return (s << uuid.toString()); +} + +inline StringBuilder& operator<<(StringBuilder& s, const UUID& uuid) { + return (s << uuid.toString()); +} + +} // namespace mongo |