c++ tr1 hash
2017-11-01 23:21:53

#include <string>

#include <tr1/unordered_map>

#include <string.h>

#include <stdio.h>

#include <stdlib.h>     /* srand, rand */

#include <time.h>       /* time */

#include <omp.h>

#include <iostream>

#define ULLONG_MAX 18446744073709551615ULL

#define MAX_LMS 5

typedef unsigned long long uint64;

typedef unsigned int uint32;

typedef struct {

        uint32 lm_indice[MAX_LMS];

        int lms_N;

}lm_indice;

std::tr1::unordered_map<uint64, lm_indice> aa;

int main()

{

    srand (time(NULL));

/*

    lm_indice li1;

    lm_indice&nbsp;li2;

    li1.lms_N = 5;

    li2.lms_N = 5;

    li1.lm_indice[0] = 1004011520;

    li1.lm_indice[1] = 1456139563;

    li1.lm_indice[2] = 1564739221;

    li1.lm_indice[3] = 1527793660;

    li1.lm_indice[4] = 245277883;

    li2.lm_indice[0] = 2013966848;

    li2.lm_indice[1] = 168021018;

    li2.lm_indice[2] = 899633766;

    li2.lm_indice[3] = 1914500838;

    li2.lm_indice[4] = 358854042;

//  uint64 key1 = std::tr1::hash<std::string>()(std::string((char*)&li1));

    uint64 key1 = std::tr1::hash<std::string>()((char*)&li1);

//  uint64 key2 = std::tr1::hash<std::string>()(std::string((char*)&li2));

    uint64 key2 = std::tr1::hash<std::string>()((char*)&li2);

    printf("%llu %llu

", key1, key2);

    lm_indice li1_1;

    lm_indice li2_1;

    memcpy(&li1_1, (char*)&li1, sizeof(lm_indice));

    memcpy(&li2_1, (char*)&li2, sizeof(lm_indice));

    for(int i=0;i<MAX_LMS;i++)

        printf("%d %d

",li1_1.lm_indice[i], li2_1.lm_indice[i]);

    getchar();

*/

    int coll = 0;

    uint64 max_gap = 0;

    uint64 N = 10000000;

//  #pragma omp parallel for

    for(uint64 T = 0;T<N;T++){

        lm_indice li;

        for(int i=0;i<MAX_LMS;i++)

            li.lm_indice[i] = (uint32)rand();

        li.lms_N = MAX_LMS;

        char* a= (char*)&li;

        uint64 key = std::tr1::hash<std::string>()((char*)&li);

        bool inserted = false;

        uint64 gap = 0;

//      std::tr1::unordered_map<uint64, lm_indice>::iterator it = aa.find(key);

//      if(it != aa.end()) coll++;

//      aa[key] = li;

//      #pragma omp parallel for

        for(uint64 k = key, kk = key;;gap++){

            bool isDone = true;

            if(gap != ULLONG_MAX){

                std::tr1::unordered_map<uint64, lm_indice>::iterator it = aa.find(k);

                if(it == aa.end()){

                    inserted = true;

//                  #pragma omp critical

                    aa[k] = li;

                    break;

                }

                isDone = false;

                uint64 r30 = RAND_MAX*rand()+rand();

                uint64 s30 = RAND_MAX*rand()+rand();

                uint64 t4  = rand() & 0xf;

                k = (r30 << 34) + (s30 << 4) + t4;

                //k = (uint64)rand();

            }

            if(isDone) break;

        }

//      #pragma omp critical

//      {

            if(gap > max_gap) max_gap = gap;

            if(!inserted) coll++;

//      }

    }

    printf("%.2f, max_gap: %llu  

",(coll*100.0f/N),max_gap);

    return 0;

}

▼ more
hash collision (memory) vs bi-directional hash map (speed)
2017-10-31 20:52:40

아마 hash collision 을 잘 하는 방법이 tree 나 별도의 DS 를 써서 해야하는 것 이겠지만... 일단 2000 번 이내에서 찾을 수 있으니 그냥 해본다고 치면

어쨌든 속도는 느릴 듯;

bi-directional 이 마음에 안들지만 어쩔수 없나;

▼ more
한 이주 전 쯤
2017-10-28 14:41:53

책을 읽지 않는 사람도 읽는 다는 그 책(들)을 마트 아동 도서 코너에서 샀다.

그리고 아직도 채 100 페이지를 읽지 못했다.

이를테면 책을 읽지 않는 사람이 책을 사서 읽지 않은 것이다. 문장 앞 뒤의 상응하는 내용을 빼고 나면 단지 도서를 구매했다는 사실만이 남는다.

뭐 이런 글을 쓰게 된 연유는 왜 우리나라는 ebook 이 망했는가에 대한 씁쓸한 기분 때문이었다.

▼ more
이번 추석부터 다이어트
2017-09-29 23:11:17

시작부터 자신이 없다.

▼ more