#include <sys/time.h>
#include <stdlib.h>
#include <iostream>
#include <hash_set>

int MAX = 100;

struct thrasher {
  int operator() (const int x) const {
    hash<int> H;

    return H(x) % (MAX*3);
  }
};
    
typedef has_set<int,thrasher> myHash;
main(int argc, char* argv[])
{
  MAX = atoi(argv[1]);

  vector<int> table(MAX*3,0);
  myHash s(MAX*3);
  timeval tp;
  int hashnum;
  int empty=0, singleton=0, collisions=0, biggest=0, collision_sum=0;
  int num, index;

  gettimeofday(&tp, NULL );
  srand(tp.tv_sec);

  for (int i=0; i< MAX; i++) {
    num = rand();
    index = thrasher()(num);
    s.insert(num);
    table[index]++;
  }

  for (int i=0; i< MAX*3; i++) {
    if (table[i] == 0) empty++;
    else if (table[i] == 1) singleton++;
    else { collisions++;  collision_sum += table[i]; }
    if (table[i]>biggest) biggest=table[i];
  }

  cout << endl << "Collisions: " << collisions << endl;
  cout << "Empty Buckets: " << empty << endl;
  cout << "Singleton Buckets: " << singleton << endl;
  cout << "Largest Bucket: " << biggest << endl;
  cout << "Avg. Collision Bucket size: " << (((float) collision_sum) / ((float) collisions)) << endl;

}

