Blame view

scripts/basic/hash.c 1.08 KB
346e15beb   Jason Baron   driver core: basi...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  /*
   * 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>
  ", program);
  	exit(1);
  }
  
  /* djb2 hashing algorithm by Dan Bernstein. From:
   * http://www.cse.yorku.ca/~oz/hash.html
   */
4356f4890   Trevor Keith   kbuild: add stati...
24
  static unsigned int djb2_hash(char *str)
346e15beb   Jason Baron   driver core: basi...
25
26
27
28
29
30
31
32
33
34
35
  {
  	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));
  }
4356f4890   Trevor Keith   kbuild: add stati...
36
  static unsigned int r5_hash(char *str)
346e15beb   Jason Baron   driver core: basi...
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
  {
  	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
  ", djb2_hash(argv[2]));
  	else if (!strcmp(argv[1], "r5"))
  		printf("%d
  ", r5_hash(argv[2]));
  	else
  		usage();
  	exit(0);
  }