linux/scripts/basic/hash.c
<<
>>
Prefs
   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
  12static const char *program;
  13
  14static 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
  24static 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
  37static 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
  50int 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