#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);
  }
};
    
main(int argc, char* argv[])
{
  MAX = atoi(argv[1]);
  hash_multiset<int,thrasher> s(MAX*3);
  timeval tp;
  int hashnum;
  int empty=0, singleton=0, collisions=0, biggest=0, collision_sum=0;

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

  for (int i=0; i< MAX; i++)
    s.insert(rand());

  for (hash_set<int,thrasher>::iterator i=s.begin(); i != s.end(); i++) {
    int n = s.count(thrasher()(*i));
    cout << *i << " -> " << thrasher()(*i) << " [" << n << "]" << endl;

    if (n == 0) empty++;
    else if (n ==1) singleton++;
    else { collisions++;  collision_sum += n; }
    if (n>biggest) biggest=n;
  }

  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;

}

