neptune/kern/libkern/badrand.c
2025-10-01 02:41:09 +02:00

52 lines
1.2 KiB
C

#include "badrand.h"
#include <stdint.h>
#include <string.h>
#define PRAND_BUILD_SEED \
((uint64_t)(__TIME__[0]) * (uint64_t)(__TIME__[1]) * (uint64_t)(__TIME__[3]) * (uint64_t)(__TIME__[4]) * \
(uint64_t)(__TIME__[6]) * (uint64_t)(__TIME__[7]))
static uint64_t seed = PRAND_BUILD_SEED * 6364136223846793005ULL + 1;
uint64_t badrand() {
seed = seed * 6364136223846793005ULL + 1;
return seed;
}
uint64_t badrand_range(uint64_t min, uint64_t max) {
uint64_t range = max - min + 1;
uint64_t x;
uint64_t limit = UINT64_MAX - (UINT64_MAX % range);
do {
x = badrand();
} while (x > limit);
return min + (x % range);
}
void badrand_buf(char *buf, size_t len) {
unsigned char *p = (unsigned char *)buf;
while (len >= 8) {
uint64_t r = badrand();
memcpy(p, &r, 8);
p += 8;
len -= 8;
}
if (len > 0) {
uint64_t r = badrand();
memcpy(p, &r, len);
}
}
void sbadrand(uint64_t s) {
if (s) {
seed ^= (s * 0x9e3779b97f4a7c15ULL) + (seed << 6) + (seed >> 2);
} else {
seed ^= PRAND_BUILD_SEED;
}
}
#undef PRAND_BUILD_SEED