Move uuid to //aos:uuid

It is getting usage significantly further outside the logger.  Time to
promote it somewhere better.  I only see it getting used more.

Change-Id: I754739347212f5a3154f68c7b7fc84b9a9074d90
diff --git a/aos/uuid.h b/aos/uuid.h
new file mode 100644
index 0000000..d12bedf
--- /dev/null
+++ b/aos/uuid.h
@@ -0,0 +1,74 @@
+#ifndef AOS_EVENTS_LOGGING_UUID_H_
+#define AOS_EVENTS_LOGGING_UUID_H_
+
+#include <array>
+#include <ostream>
+#include <string>
+
+#include "absl/types/span.h"
+#include "flatbuffers/flatbuffers.h"
+
+namespace aos {
+
+// Class to generate and hold a UUID.
+class UUID {
+ public:
+  // Size of a UUID both as a string and the raw data.
+  static constexpr size_t kStringSize = 36;
+  static constexpr size_t kDataSize = 16;
+
+  // Returns a randomly generated UUID.  This is known as a UUID4.
+  static UUID Random();
+
+  // Returns a uuid with all '0's.
+  static UUID Zero();
+
+  // Converts a string UUID of the form 00000000-0000-0000-0000-000000000000 to
+  // a UUID.
+  static UUID FromString(std::string_view string);
+  static UUID FromString(const flatbuffers::String *string);
+
+  // Converts a 16 byte vector (128 bits) to a UUID.  This requires no
+  // transformation.
+  static UUID FromVector(const flatbuffers::Vector<uint8_t> *data);
+
+  // Returns the boot UUID for the current linux computer.
+  static UUID BootUUID();
+
+  // Default constructor which builds an uninitialized UUID.  Use one of the
+  // static methods if you want something more useful.
+  UUID() {}
+
+  // Packs this UUID into a flatbuffer as a string.
+  flatbuffers::Offset<flatbuffers::String> PackString(
+      flatbuffers::FlatBufferBuilder *fbb) const;
+  // Copies this UUID as a string into the memory pointed by result.  Result
+  // must be at least kStringSize long.
+  void CopyTo(char *result) const;
+  // Returns this UUID as a string.
+  std::string ToString() const;
+
+  // Packs the UUID bytes directly into a vector.
+  flatbuffers::Offset<flatbuffers::Vector<uint8_t>> PackVector(
+      flatbuffers::FlatBufferBuilder *fbb) const;
+
+  // Returns the underlying UUID data.
+  absl::Span<const uint8_t> span() const {
+    return absl::Span<const uint8_t>(data_.data(), data_.size());
+  }
+
+  bool operator==(const UUID &other) const { return other.span() == span(); }
+  bool operator!=(const UUID &other) const { return other.span() != span(); }
+
+ private:
+  friend std::ostream &operator<<(std::ostream &os, const UUID &uuid);
+
+  // Encoded storage for the data.
+  std::array<uint8_t, kDataSize> data_;
+};
+
+std::ostream &operator<<(std::ostream &os, const UUID &uuid);
+
+}  // namespace aos
+
+#endif  // AOS_EVENTS_LOGGING_UUID_H_