198 GetSystemTimeAsFileTime(&ftime);
201 struct timespec ts = {};
202# ifdef CLOCK_MONOTONIC
203 clock_gettime(CLOCK_MONOTONIC, &ts);
206# ifdef CLOCK_REALTIME
207 clock_gettime(CLOCK_REALTIME, &ts);
210# ifdef CLOCK_BOOTTIME
211 clock_gettime(CLOCK_BOOTTIME, &ts);
215 struct timeval tv = {};
216 gettimeofday(&tv,
nullptr);
220 hasher << std::chrono::system_clock::now().time_since_epoch().count();
221 hasher << std::chrono::steady_clock::now().time_since_epoch().count();
222 hasher << std::chrono::high_resolution_clock::now().time_since_epoch().count();
226 struct rusage usage = {};
227 if (getrusage(RUSAGE_SELF, &usage) == 0) hasher << usage;
231 AddFile(hasher,
"/proc/diskstats");
232 AddFile(hasher,
"/proc/vmstat");
233 AddFile(hasher,
"/proc/schedstat");
234 AddFile(hasher,
"/proc/zoneinfo");
235 AddFile(hasher,
"/proc/meminfo");
236 AddFile(hasher,
"/proc/softirqs");
237 AddFile(hasher,
"/proc/stat");
238 AddFile(hasher,
"/proc/self/schedstat");
239 AddFile(hasher,
"/proc/self/status");
244# if defined(KERN_PROC) && defined(KERN_PROC_ALL)
245 AddSysctl<CTL_KERN, KERN_PROC, KERN_PROC_ALL>(hasher);
250 AddSysctl<CTL_HW, HW_DISKSTATS>(hasher);
255 AddSysctl<CTL_VM, VM_LOADAVG>(hasher);
258 AddSysctl<CTL_VM, VM_TOTAL>(hasher);
261 AddSysctl<CTL_VM, VM_METER>(hasher);
267 void* addr = malloc(4097);
268 hasher << &addr << addr;
275 hasher << (CHAR_MIN < 0) <<
sizeof(
void*) <<
sizeof(long) <<
sizeof(
int);
276#if defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__)
277 hasher << __GNUC__ << __GNUC_MINOR__ << __GNUC_PATCHLEVEL__;
282 hasher << __cplusplus;
284 hasher << _XOPEN_VERSION;
287 const char* COMPILER_VERSION = __VERSION__;
288 hasher.
Write((
const unsigned char*)COMPILER_VERSION, strlen(COMPILER_VERSION) + 1);
294#if defined(HAVE_STRONG_GETAUXVAL)
297 hasher << getauxval(AT_HWCAP);
300 hasher << getauxval(AT_HWCAP2);
303 const unsigned char* random_aux = (
const unsigned char*)getauxval(AT_RANDOM);
304 if (random_aux) hasher.
Write(random_aux, 16);
307 const char* platform_str = (
const char*)getauxval(AT_PLATFORM);
308 if (platform_str) hasher.
Write((
const unsigned char*)platform_str, strlen(platform_str) + 1);
311 const char* exec_str = (
const char*)getauxval(AT_EXECFN);
312 if (exec_str) hasher.
Write((
const unsigned char*)exec_str, strlen(exec_str) + 1);
325 constexpr DWORD max_size = MAX_COMPUTERNAME_LENGTH + 1;
326 char hname[max_size];
327 DWORD size = max_size;
328 if (GetComputerNameA(hname, &size) != 0) {
333 if (gethostname(hname, 256) == 0) {
334 hasher.
Write((
const unsigned char*)hname, strnlen(hname, 256));
340 struct ifaddrs *ifad =
nullptr;
342 struct ifaddrs *ifit = ifad;
343 while (ifit !=
nullptr) {
344 hasher.
Write((
const unsigned char*)&ifit,
sizeof(ifit));
345 hasher.
Write((
const unsigned char*)ifit->ifa_name, strlen(ifit->ifa_name) + 1);
346 hasher.
Write((
const unsigned char*)&ifit->ifa_flags,
sizeof(ifit->ifa_flags));
347 AddSockaddr(hasher, ifit->ifa_addr);
348 AddSockaddr(hasher, ifit->ifa_netmask);
349 AddSockaddr(hasher, ifit->ifa_dstaddr);
350 ifit = ifit->ifa_next;
358 if (uname(&name) != -1) {
359 hasher.
Write((
const unsigned char*)&name.sysname, strlen(name.sysname) + 1);
360 hasher.
Write((
const unsigned char*)&name.nodename, strlen(name.nodename) + 1);
361 hasher.
Write((
const unsigned char*)&name.release, strlen(name.release) + 1);
362 hasher.
Write((
const unsigned char*)&name.version, strlen(name.version) + 1);
363 hasher.
Write((
const unsigned char*)&name.machine, strlen(name.machine) + 1);
367 AddPath(hasher,
"/");
368 AddPath(hasher,
".");
369 AddPath(hasher,
"/tmp");
370 AddPath(hasher,
"/home");
371 AddPath(hasher,
"/proc");
373 AddFile(hasher,
"/proc/cmdline");
374 AddFile(hasher,
"/proc/cpuinfo");
375 AddFile(hasher,
"/proc/version");
377 AddFile(hasher,
"/etc/passwd");
378 AddFile(hasher,
"/etc/group");
379 AddFile(hasher,
"/etc/hosts");
380 AddFile(hasher,
"/etc/resolv.conf");
381 AddFile(hasher,
"/etc/timezone");
382 AddFile(hasher,
"/etc/localtime");
390 AddSysctl<CTL_HW, HW_MACHINE>(hasher);
393 AddSysctl<CTL_HW, HW_MODEL>(hasher);
396 AddSysctl<CTL_HW, HW_NCPU>(hasher);
399 AddSysctl<CTL_HW, HW_PHYSMEM>(hasher);
402 AddSysctl<CTL_HW, HW_USERMEM>(hasher);
404# ifdef HW_MACHINE_ARCH
405 AddSysctl<CTL_HW, HW_MACHINE_ARCH>(hasher);
408 AddSysctl<CTL_HW, HW_REALMEM>(hasher);
411 AddSysctl<CTL_HW, HW_CPU_FREQ>(hasher);
414 AddSysctl<CTL_HW, HW_BUS_FREQ>(hasher);
417 AddSysctl<CTL_HW, HW_CACHELINE>(hasher);
422 AddSysctl<CTL_KERN, KERN_BOOTFILE>(hasher);
425 AddSysctl<CTL_KERN, KERN_BOOTTIME>(hasher);
427# ifdef KERN_CLOCKRATE
428 AddSysctl<CTL_KERN, KERN_CLOCKRATE>(hasher);
431 AddSysctl<CTL_KERN, KERN_HOSTID>(hasher);
434 AddSysctl<CTL_KERN, KERN_HOSTUUID>(hasher);
437 AddSysctl<CTL_KERN, KERN_HOSTNAME>(hasher);
439# ifdef KERN_OSRELDATE
440 AddSysctl<CTL_KERN, KERN_OSRELDATE>(hasher);
442# ifdef KERN_OSRELEASE
443 AddSysctl<CTL_KERN, KERN_OSRELEASE>(hasher);
446 AddSysctl<CTL_KERN, KERN_OSREV>(hasher);
449 AddSysctl<CTL_KERN, KERN_OSTYPE>(hasher);
452 AddSysctl<CTL_KERN, KERN_OSREV>(hasher);
455 AddSysctl<CTL_KERN, KERN_VERSION>(hasher);
462 for (
size_t i = 0; environ[i]; ++i) {
463 hasher.
Write((
const unsigned char*)environ[i], strlen(environ[i]));
469 hasher << GetCurrentProcessId() << GetCurrentThreadId();
471 hasher << getpid() << getppid() << getsid(0) << getpgid(0) << getuid() << geteuid() << getgid() << getegid();
473 hasher << std::this_thread::get_id();
#define S(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p)