| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- /*
- * Produce a "generalized CRC" table. Assumes a platform with
- * /dev/urandom -- otherwise reimplement get_random_byte().
- */
- #include <errno.h>
- #include <fcntl.h>
- #include <inttypes.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
- static uint8_t get_random_byte(void)
- {
- static int fd = -1;
- uint8_t buf;
- int rv;
- if (fd < 0)
- fd = open("/dev/urandom", O_RDONLY);
- do {
- errno = 0;
- rv = read(fd, &buf, 1);
- if (rv < 1 && errno != EAGAIN)
- abort();
- } while (rv < 1);
- return buf;
- }
- static void random_permute(uint8_t *buf)
- {
- int i, j, k;
- int m;
- for (i = 0; i < 256; i++)
- buf[i] = i;
- m = 255;
- for (i = 255; i > 0; i--) {
- if (i <= (m >> 1))
- m >>= 1;
- do {
- j = get_random_byte() & m;
- } while (j > i);
- k = buf[i];
- buf[i] = buf[j];
- buf[j] = k;
- }
- }
- static void xcrc_table(uint64_t *buf)
- {
- uint8_t perm[256];
- int i, j;
- memset(buf, 0, 8*256); /* Make static checkers happy */
- for (i = 0; i < 8; i++) {
- random_permute(perm);
- for (j = 0; j < 256; j++)
- buf[j] = (buf[j] << 8) | perm[j];
- }
- }
- int main(void)
- {
- int i;
- uint64_t buf[256];
- xcrc_table(buf);
- for (i = 0; i < 256; i++) {
- printf("%016"PRIx64"\n", buf[i]);
- }
- return 0;
- }
|