Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/34: Рейтинг темы: голосов - 34, средняя оценка - 4.76
20 / 20 / 11
Регистрация: 12.07.2015
Сообщений: 350

Программа, определяющая хеш файла

18.10.2015, 13:29. Показов 6517. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, задача такая, что надо написать программу, которая будет определять хеш заданного файла. Есть код программы, где определяется хеш текстовика. Заранее спасибо.

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
#include "stdafx.h"
#include <iostream>
#include <functional>
#include <string>
#include <fstream>
 
using namespace std;
 
 
unsigned int HashFAQ6(const char * str)
{
 
    unsigned int hash = 0;
 
    for (; *str; str++)
    {
        hash += (unsigned char)(*str);
        hash += (hash << 10);
        hash ^= (hash >> 6);
    }
    hash += (hash << 3);
    hash ^= (hash >> 11);
    hash += (hash << 15);
 
    return hash;
 
}
 
int main()
{
    setlocale(LC_ALL, "rus");
 
    size_t count = 0;
    ifstream f("C:\\TXT.txt");
    while (f.get() != EOF) ++count;//подсчет кол-ва символов в файле
    char *str = new char[count + 1];
 
    f.clear();
    f.seekg(0);
    f.get(str, count, '\0');
 
    cout << str << endl; //Вывод переменной уже с записанным в нее текстом
    cout << endl;
 
    cout << HashFAQ6(str) << endl;
 
    system("PAUSE");
    return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.10.2015, 13:29
Ответы с готовыми решениями:

Программа определяющая, пройдет ли график функции y = 5x2 – 7 x + 2
Ааа, народ выручайте пожалуйста. Сейчас экзамен в академии, а я не очень шарю в этом. Задание: 3. Составить программу, определяющую,...

Программа, определяющая принадлежность точки к заштрихованной области
Требуется написать программу, при выполнении которой с клавиатуры считываются координаты точки на плоскости (x, y - действительные числа) и...

Программа, определяющая номер употребления знака в тексте
Пишу шифратор. Для части из алгоритма шифрования нужно к номеру в алфавите добавлять порядковый номер повторения в тексте. Как написать...

17
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
18.10.2015, 13:47
Программа есть. Программа, я так понял, работает. Так а что надо то?
0
20 / 20 / 11
Регистрация: 12.07.2015
Сообщений: 350
18.10.2015, 13:49  [ТС]
Программа определяет хеш текстового файла. Нужно определить другого формата, например exe. Получается, если Вы написали ваше сообщение, то по аналогичному принципу определяется и хеш экзешника ?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
18.10.2015, 13:51
Цитата Сообщение от Nik- Посмотреть сообщение
Получается, если Вы написали ваше сообщение, то по аналогичному принципу определяется и хеш экзешника ?
Да. Получается так. Только убедись что файл открывается в двоичном режиме.
C++
1
ifstream f( "C:\\TXT.txt", ios::binary );
1
20 / 20 / 11
Регистрация: 12.07.2015
Сообщений: 350
18.10.2015, 13:57  [ТС]
Спасибо, все работает . А не подскажите какой хеш-функцией лучше пользоваться, в дальнейшем будет база данных хешей и нужно будет их с хешем файла.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
18.10.2015, 14:21
Наверное лучше та, у которой размер (в битах) больше.

Добавлено через 1 минуту
Вот тут есть небольшой список. Можешь выбрать.

Добавлено через 16 минут
Я не знаю насколько правильно подходит твой метод чтения для двоичных файлов, поэтому советую использовать старый дедовский способ. Он и побыстрее должен быть.
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
#include <cstdio>
#include <cstdint>
 
int main()
{
    FILE * fp = fopen( "test.exe", "rb" );
    if ( fp ) {
        fseek( fp, 0, SEEK_END );
        size_t size = ftell( fp );
        fseek( fp, 0, SEEK_SET );
 
        printf( "%d\n", size );
 
        uint8_t * p_data = new uint8_t [size];
        fread( p_data, size, 1, fp );
        fclose( fp );
 
        /// calc hash ...
 
        delete [] p_data;
    } else {
        fprintf( stderr, "fopen(): error\n" );
    }
}
2
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
18.10.2015, 14:45
Цитата Сообщение от castaway Посмотреть сообщение
Наверное лучше та, у которой размер (в битах) больше.
Вот тут я вынужден внести важную поправку. Дело в том, что "лучше" очень сильно зависит от цели, и "лучше" для криптографа, разрабатывающего цифровую подпись, не имеет ничего общего с "лучше" разработчика, желающего защититься от случайного повреждения данных.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
18.10.2015, 14:49
Nick Alte, честного говоря, я не спец в хешах. Но однозначно было бы проще ответить на этот вопрос если бы мы услышали чётко поставленную задачу.
0
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
18.10.2015, 15:01
castaway, судя по изложенному (вычисление хеша файла и занесение в базу), логично будет предположить, что задача - идентификация файлов по содержимому, для чего хватит CRC32 или в крайнем случае MD5 (хотя это уже скорее всего оверкилл).
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
18.10.2015, 15:05
Nick Alte, ну есть же вероятность что хеши разных файлов совпадут. И с одной функцией эта вероятность будет меньше чем с другой.
0
20 / 20 / 11
Регистрация: 12.07.2015
Сообщений: 350
18.10.2015, 15:28  [ТС]
Задача: написать антивирус с сигнатурным методом детектирования. Есть хеш файла и вируса, если хеш вируса присутствует в файле, то удалить этот файл. И можно добавлять хеш в базу.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
18.10.2015, 15:32
Цитата Сообщение от Nik- Посмотреть сообщение
если хеш вируса присутствует в файле
Это каким-таким волшебным образом можно это проверить?
0
20 / 20 / 11
Регистрация: 12.07.2015
Сообщений: 350
18.10.2015, 15:35  [ТС]
хеш-суммы зараженного и файла без вируса по идее разные. Я только начал изучать хеширование, не знаю, можно или нет.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
18.10.2015, 15:46
Если ты хочешь просто мониторить хеши, тогда понятно.
0
20 / 20 / 11
Регистрация: 12.07.2015
Сообщений: 350
18.10.2015, 15:49  [ТС]
Если я все правильно понял, то вывод из программ выше - хеш-суммы ?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
18.10.2015, 15:53
Цитата Сообщение от Nik- Посмотреть сообщение
Если я все правильно понял, то вывод из программ выше - хеш-суммы ?
В твоей - да. В моей выводится размер файла (забыл убрать). Хеш в моей программе не считается, там только загрузка файла в память.
1
20 / 20 / 11
Регистрация: 12.07.2015
Сообщений: 350
18.10.2015, 16:00  [ТС]
Спасибо за помощь
0
1 / 1 / 4
Регистрация: 20.10.2016
Сообщений: 154
14.05.2021, 14:51
подскажите как добавить функционал к коду ТС ?
1) Криптостойкость (достигается путем применения односторонних математических операций и досаливания хэша)
2) Лавинность (изменение одного символа исходного текста приводит к полному изменению хэш-суммы)
3) Фиксированная длина хэша

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
#include "stdafx.h"
#include <iostream>
#include <functional>
#include <string>
#include <fstream>
 
using namespace std;
 
 
unsigned int HashFAQ6(const char * str)
{
 
    unsigned int hash = 0;
 
    for (; *str; str++)
    {
        hash += (unsigned char)(*str);
        hash += (hash << 10);
        hash ^= (hash >> 6);
    }
    hash += (hash << 3);
    hash ^= (hash >> 11);
    hash += (hash << 15);
 
    return hash;
 
}
 
int main()
{
    setlocale(LC_ALL, "rus");
 
    size_t count = 0;
    ifstream f("C:\\TXT.txt");
    while (f.get() != EOF) ++count;//подсчет кол-ва символов в файле
    char *str = new char[count + 1];
 
    f.clear();
    f.seekg(0);
    f.get(str, count, '\0');
 
    cout << str << endl; //Вывод переменной уже с записанным в нее текстом
    cout << endl;
 
    cout << HashFAQ6(str) << endl;
 
    system("PAUSE");
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.05.2021, 14:51
Помогаю со студенческими работами здесь

Программа, определяющая количество чисел, кратных данному
Прошу помочь новичку найти ошибку, т.к. после ввода числа ничего не происходит. #include&lt;conio.h&gt; #include&lt;iostream.h&gt; ...

Программа определяющая является ли 2 строка перевёрнутой первой
Код C #include&lt;iostream&gt; #include&lt;conio.h&gt; #include&lt;cstring&gt; using namespace std; int main() {

Программа с классом, определяющая название дня недели
Захотелось написать программу с классом, пользователь вводит номер дня (1-7), а программа название дня. Вот код: #include...

Программа, определяющая разницу в сутках между двумя датами
Составьте программу определяющую разницу в сутках между двумя датами. Нельзя использовать условный оператор , помогите пожалуйста ...

Программа, определяющая слово с наибольшем и наименьшем количеством букв
Народ, нужен код, который будет определять слово с наибольшем и наименьшем количеством букв в предложении, введенном с клавиатуры.


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru