home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / scripts / basic / hash.c < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  1.1 KB  |  65 lines

  1. /*
  2.  * Copyright (C) 2008 Red Hat, Inc., Jason Baron <jbaron@redhat.com>
  3.  *
  4.  */
  5.  
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9.  
  10. #define DYNAMIC_DEBUG_HASH_BITS 6
  11.  
  12. static const char *program;
  13.  
  14. static void usage(void)
  15. {
  16.     printf("Usage: %s <djb2|r5> <modname>\n", program);
  17.     exit(1);
  18. }
  19.  
  20. /* djb2 hashing algorithm by Dan Bernstein. From:
  21.  * http://www.cse.yorku.ca/~oz/hash.html
  22.  */
  23.  
  24. unsigned int djb2_hash(char *str)
  25. {
  26.     unsigned long hash = 5381;
  27.     int c;
  28.  
  29.     c = *str;
  30.     while (c) {
  31.         hash = ((hash << 5) + hash) + c;
  32.         c = *++str;
  33.     }
  34.     return (unsigned int)(hash & ((1 << DYNAMIC_DEBUG_HASH_BITS) - 1));
  35. }
  36.  
  37. unsigned int r5_hash(char *str)
  38. {
  39.     unsigned long hash = 0;
  40.     int c;
  41.  
  42.     c = *str;
  43.     while (c) {
  44.         hash = (hash + (c << 4) + (c >> 4)) * 11;
  45.         c = *++str;
  46.     }
  47.     return (unsigned int)(hash & ((1 << DYNAMIC_DEBUG_HASH_BITS) - 1));
  48. }
  49.  
  50. int main(int argc, char *argv[])
  51. {
  52.     program = argv[0];
  53.  
  54.     if (argc != 3)
  55.         usage();
  56.     if (!strcmp(argv[1], "djb2"))
  57.         printf("%d\n", djb2_hash(argv[2]));
  58.     else if (!strcmp(argv[1], "r5"))
  59.         printf("%d\n", r5_hash(argv[2]));
  60.     else
  61.         usage();
  62.     exit(0);
  63. }
  64.  
  65.