mirror of
https://github.com/netwide-assembler/nasm.git
synced 2025-03-19 18:00:23 +08:00
xcrcgen: tool to create a "generalized CRC" hash table
A so-called "generalized CRC" is a form of hash function based on a table similar to the conventional bytewise software implementation of CRC. For each byte in each data set, it contains a random byte permutation table. Signed-off-by: H. Peter Anvin <hpa@zytor.com>
This commit is contained in:
parent
02d66b182c
commit
fc81021fcf
80
misc/xcrcgen.c
Normal file
80
misc/xcrcgen.c
Normal file
@ -0,0 +1,80 @@
|
||||
/*
|
||||
* 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;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user