Skip to content
Snippets Groups Projects
Select Git revision
  • e234b44b48c4f18e0566a86b6a99c827f68668ef
  • 2025ss default
  • 2024ss
  • 2023ss
  • 2022ss
  • 2021ss
  • 2020ss
  • 2019ss
  • 2018ss
9 results

hash-map-test-01.c

Blame
  • hash-map-test-01.c 2.00 KiB
    #include <stdio.h>
    #include <errno.h>
    #include <error.h>
    #include <string.h>
    #include <stdint.h>
    #include <stdlib.h>
    
    const int ERROR = -1;
    const int size = 1117;
    const int bufsize = 100;
    
    int n[size];  // zunächst: alle 0
    const char *check[size];  // zunächst: alle NULL
    
    constexpr int hash (const char *name)
    {
      // Cantor pairing function
      uint8_t n0 = name ? name[0] : 0;
      uint8_t n1 = n0 ? name[1] : 0;
      uint8_t n2 = n1 ? name[2] : 0;
      return ((n0 + n1) / 2 * (n0 + n1 + 1) + n2) % size;
    }
    
    void put_number (const char *name, int value)
    {
      int idx = hash (name);
      if (check[idx] && strcmp (check[idx], name) != 0)
        fprintf (stderr, "occupied: %s = %d\n", name, value);
      else
        {
          check[idx] = name;
          n[idx] = value;
        }
    }
    
    int get_number (const char *name)
    {
      int value = ERROR;
      int idx = hash (name);
      if (check[idx] && strcmp (check[idx], name) == 0)
        value = n[idx];
      else
        fprintf (stderr, "not found: %s\n", name);
      return value;
    }
    
    static void read_data (FILE *f, char **name, int *value)
    {
      int v;
      char buffer[bufsize];
      fscanf (f, "%d", &v);
      fgets (buffer, bufsize - 1, f);
      int l = strlen (buffer);
      if (l > 0 && buffer[l - 1] == '\n')
        buffer[l - 1] = 0;
      const char *n = buffer;
      while (n[0] == ' ')
        n++;
      l = strlen (n);
      if (*name == NULL)
        *name = (char *) malloc (l);
      strncpy (*name, n, l + 1);
      *value = v;
    }
    
    int main (int argc, char **argv)
    {
      const char *filename = "hash-test.dat";
      if (argc > 1)
        filename = argv[1];
      FILE *f = fopen (filename, "r");
      if (!f)
        error (errno, errno, "cannot open file \"%s\"", filename);
      while (!feof (f))
        {
          int value;
          char *name = NULL;
          read_data (f, &name, &value);
          put_number (name, value);
        }
      rewind (f);
      while (!feof (f))
        {
          int value;
          char name[bufsize];
          char *p = name;
          read_data (f, &p, &value);
          int v = get_number (name);
          if (v != value)
            printf ("%s: %d instead of %d\n", name, v, value);
        }
      fclose (f);
      return 0;
    }