diff options
Diffstat (limited to 'scripts/basic/hash.c')
| -rw-r--r-- | scripts/basic/hash.c | 64 | 
1 files changed, 64 insertions, 0 deletions
| diff --git a/scripts/basic/hash.c b/scripts/basic/hash.c new file mode 100644 index 000000000000..3299ad7fc8c0 --- /dev/null +++ b/scripts/basic/hash.c @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2008 Red Hat, Inc., Jason Baron <jbaron@redhat.com> + * + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#define DYNAMIC_DEBUG_HASH_BITS 6 + +static const char *program; + +static void usage(void) +{ +	printf("Usage: %s <djb2|r5> <modname>\n", program); +	exit(1); +} + +/* djb2 hashing algorithm by Dan Bernstein. From: + * http://www.cse.yorku.ca/~oz/hash.html + */ + +unsigned int djb2_hash(char *str) +{ +	unsigned long hash = 5381; +	int c; + +	c = *str; +	while (c) { +		hash = ((hash << 5) + hash) + c; +		c = *++str; +	} +	return (unsigned int)(hash & ((1 << DYNAMIC_DEBUG_HASH_BITS) - 1)); +} + +unsigned int r5_hash(char *str) +{ +	unsigned long hash = 0; +	int c; + +	c = *str; +	while (c) { +		hash = (hash + (c << 4) + (c >> 4)) * 11; +		c = *++str; +	} +	return (unsigned int)(hash & ((1 << DYNAMIC_DEBUG_HASH_BITS) - 1)); +} + +int main(int argc, char *argv[]) +{ +	program = argv[0]; + +	if (argc != 3) +		usage(); +	if (!strcmp(argv[1], "djb2")) +		printf("%d\n", djb2_hash(argv[2])); +	else if (!strcmp(argv[1], "r5")) +		printf("%d\n", r5_hash(argv[2])); +	else +		usage(); +	exit(0); +} + | 
