Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Artishok
ЧакЭ одобряЭ
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
#1

Организовать ассоциированную карту строк, с возможностью быстрого поиска по хеш-таблице - C++

08.01.2012, 14:44. Просмотров 753. Ответов 2
Метки нет (Все метки)

задание таково
организовать асоциированную карту строк, с возможностью быстрого поиска по хеш-таблице
хеш функция - md4

суть проблем в чем.
хеш-таблица в STL - hash_map. значит ключом должен быть - хеш,а значением - строка. но! я считал что добавлять в таблицу можно разные значения. то есть если уже строка содержится в таблице её добавить нельзя. но у меня почему-то добавляется.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <hash_map>
#include <iostream>
#include <Windows.h>
#include <stdlib.h>
#include <WinCrypt.h>
#include <string>
#pragma comment(lib,"crypt32.lib")
 
int _tmain(int argc, _TCHAR* argv[])
{
    std::hash_map<HCRYPTHASH*,std::string*> table;
    while(1)
    {
        ::system("cls");
        std::cout<<"Add---1\n";
        std::cout<<"View--2\n";
        std::cout<<"Find--3\n";
        int x;
        std::cin>>x;
        switch(x)
        {
        case 1:
            {
                ::system("cls");
                        std::string *tohash=new std::string();
                            std::cout<<"String to hash\n";
                            std::cin>>*tohash;
                        HCRYPTHASH *hash=new HCRYPTHASH();
                        HCRYPTPROV *prov=new HCRYPTPROV();
                        BYTE *buf1=(BYTE*)tohash->c_str();
                            DWORD buf1len=strlen((char*)buf1)+1;
                            ::CryptAcquireContext(prov,NULL,NULL,PROV_RSA_AES,0);
                            ::CryptCreateHash(*prov,CALG_MD4,0,0,hash);
                            ::CryptHashData(*hash,buf1,buf1len,0);
                        std::pair<HCRYPTHASH*,std::string*> pair;
                        pair.first=hash;
                        pair.second=tohash;
                        table.insert(pair);
                ::system("pause");
                break;
            }
        case 2:
            {
                ::system("cls");
                std::cout<<"Contains\n";
                            for each(std::pair<HCRYPTHASH*,std::string*> x in table)
                            {
                             BYTE hash[16];
                             DWORD length=16;
                             ::CryptGetHashParam(*x.first,HP_HASHVAL,hash,&length,0);
                             for(int i=0;i<length;i++)
                              std::cout<<hash[i];
                             std::cout<<" "<<*x.second;
                             std::cout<<std::endl;
                            }
                ::system("pause");
                break;
            }
        case 3:
            {
                ::system("cls");
                std::string *tocompare=new std::string();
                            std::cout<<"String to compare\n";
                            std::cin>>*tocompare;
                                HCRYPTPROV *provider=new HCRYPTPROV();
                            HCRYPTHASH *hashA=new HCRYPTHASH();
                            BYTE *buf11=(BYTE*)tocompare->c_str();
                            DWORD buf11len=strlen((char*)buf11)+1;
                            ::CryptAcquireContext(provider,NULL,NULL,PROV_RSA_AES,0);
                            ::CryptCreateHash(*provider,CALG_MD4,0,0,hashA);
                            ::CryptHashData(*hashA,buf11,buf11len,0);
                BYTE guf[16];
                            DWORD rip=16;
                            ::CryptGetHashParam(*hashA,HP_HASHVAL,guf,&rip,0);
                std::cout<<"Hash to compare\n";
                            for(int i=0;i<rip;i++)
                             std::cout<<guf[i];
                            std::cout<<" "<<*tocompare<<"\nResult of find\n";
                for each(std::pair<HCRYPTHASH*,std::string*> x in table)
                            {
                             BYTE hash[16];
                             DWORD length=16;
                             ::CryptGetHashParam(*x.first,HP_HASHVAL,hash,&length,0);
                             if (memcmp(guf,hash,16)==0)
                             {
                                 printf("Found\n");
                             break;
                             }
                            }
                ::system("pause");
                            break;
            }
        }
    }
}
еще непонятен быстрый поиск. я просто обхожу таблицу перебором. а как правильно надо?

Добавлено через 19 часов 38 минут
может быть проблема что ключом является указатель?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.01.2012, 14:44
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Организовать ассоциированную карту строк, с возможностью быстрого поиска по хеш-таблице (C++):

Кто знаком с алгоритмом быстрого поиска - C++
Поиск в массиве Расскажите и если можно код на языке с++ с комметариями Добавлено через 5 минут вот есть алгоритм, но не могу...

Вопрос по хеш-таблице - C++
Приветствую! У меня есть хеш таблица: тип ключа - строка текста произвольной длины. Метод хеширования - модульный. Метод разрешения...

Телефонная книга: подскажите алгоритм быстрого поиска контактов - C++
привет всем! какой самый быстрий алгоритм поиска контактов.и какие вы предлагайте допустим у нас имена Anton Aren Arsen Arkadi ...

Какую БД выбрать, с возможностью быстрого переноса - C#
Здравствуйте. Начинаю писать небольшую программку по работе с БД(запись/редактирование/выборка данных по нескольким параметрам и т.д.)....

Вставить в код BAT-файла большой объём воспроизводимого текста с возможностью его быстрого редактирования - CMD/BAT
Уважаемые эксперты. Здравствуйте, подскажите пожалуйста, как в BAT-файл можно вставить любой большой объем текста? Чтоб потом можно было...

Задача быстрого поиска - Информатика
Предыстория. Когда-то давно была написана некая программа, которыя собирала статистику и хранила значения в виде пары (key1, key2)....

2
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
08.01.2012, 15:35 #2
Думаю, дело в том, что значением является указатель:
Цитата Сообщение от Artishok Посмотреть сообщение
std::string *tohash=new std::string();
Каждый раз объект-то новый, даже если содержимое одинаковое. И адрес объекта тоже новый.
0
Artishok
ЧакЭ одобряЭ
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
08.01.2012, 19:03  [ТС] #3
не не помогло.

я решил хранить вместо HCRYPTHASH массив байтов BYTE* и это тоже не помогло.

Добавлено через 1 час 49 минут
возможно ли использовать в качестве ключа - std::vector? потому что в таком случае
C++
1
2
3
4
5
6
7
8
    std::hash_map<std::vector<BYTE>,std::string> table1;
    std::pair<std::vector<BYTE>,std::string> pair1;
    std::vector<BYTE> *a=new std::vector<BYTE>();
    std::vector<BYTE>::iterator iter;
    a->insert(a->begin(),5);
    pair1.first=*a;
    pair1.second="noname";
    table1.insert(pair1);
ругается что
cannot convert from 'const std::vector<_Ty>' to 'size_t
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.01.2012, 19:03
Привет! Вот еще темы с ответами:

Алгоритм быстрого поиска - Free Pascal
Ребят, помогите, кто чем может, для курсовой очень надо(( если есть какие-то предложения, пишите здесь алгоритм быстрого...

Организовать хеш-таблицу - Delphi
Организовать хеш-таблицу, используя h(x) по методу умножения для формирования хеш-адреса. Разрешение коллизии - методом цепочек(внешних)....

Реализация быстрого поиска по началам слов - C#
Добрый день. Имеем названия документов, нужно реализовать поиск документа по части слова или нескольким словам. Допустим, документ...

Оптимизировать структуру таблицы для быстрого поиска - MySQL
Здравствуйте. Имеется таблица контактов компаний с огромным количеством данных. Сами контакты хранятся в поле `value`. По этому же полю...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru