37 typedef std::array<std::uint8_t, MachineIDSize>
MachineID;
44 "/var/lib/dbus/machine-id",
45 "/sys/class/dmi/id/product_uuid"
52 static std::vector<std::string>
mergeLists(
const std::vector<std::string>& a,
const std::vector<std::string>& b)
54 std::vector<std::string> ab;
55 ab.reserve(a.size() + b.size());
56 ab.insert(ab.end(), a.begin(), a.end());
57 ab.insert(ab.end(), b.begin(), b.end());
69 std::ifstream infile(location);
72 catch (std::exception&)
80 std::transform(token.begin(), token.end(), token.begin(), [](
char x) { return std::tolower(x); });
81 token.erase(std::remove_if(token.begin(), token.end(),
82 [](
char x){ return (x <
'a' || x >
'f') && !std::isdigit(x); }),
94 auto sym = std::begin(token);
95 for (
auto&
byte : out_id)
97 assert(sym != std::end(token));
98 byte = std::stoi(std::string{*sym++, *sym++},
nullptr, 16);
132 throw Exception(
"Failed to read machine ID");
144 const std::string& node_name,
155 std::array<std::uint8_t, 16> out;
160 crc.
add(machine_id.data(),
static_cast<unsigned>(machine_id.size()));
161 HalfID half(crc.
get());
162 std::copy_n(half.bytes, 8, out.begin());
168 crc.
add(
reinterpret_cast<const std::uint8_t*
>(node_name.c_str()),
static_cast<unsigned>(node_name.length()));
169 crc.
add(instance_id);
170 HalfID half(crc.
get());
171 std::copy_n(half.bytes, 8, out.begin() + 8);