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

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

Войти
Регистрация
Восстановить пароль
 
 
eXPonent
99 / 52 / 2
Регистрация: 21.05.2012
Сообщений: 1,170
#1

Как подсчитать контрольную сумму файла или вектора? - C++

30.03.2017, 10:13. Просмотров 453. Ответов 20

1) Как подсчитать контрольную сумму подобного вектора?
C++
1
2
3
4
5
6
7
8
9
struct Trans
{
    string Tag;
    string Rus;
    string Eng;
    inline Trans(const string &Tag, const string &Rus, const string &Eng) : Tag(Tag), Rus(Rus), Eng(Eng) {}
    inline string toString() {return '\n' + Tag + '\n' + Rus + '\n' + Eng;}
};
static vector<Trans> RaRE;
2) Как подсчитать контрольную сумму файла?

или нужно писать свои собственные методы?

Добавлено через 15 часов 30 минут
Ориентируясь на ссылки:
Проверка файла на контрольную сумму MD5
и
https://msdn.microsoft.com/en-us/library/aa382380%28VS.85%29.aspx

для файлов возможно придется, что то подобное использовать
А вот с vector<string> так и не нашел
видимо, там придется придумывать свой хитрый алгоритм
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.03.2017, 10:13
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как подсчитать контрольную сумму файла или вектора? (C++):

Работа с файлами. Найти контрольную сумму - C++
Помогите составить задачу. Файл текстовый. Алгоритм контрольной суммы стандартный. Составить программу, которая: 1) Формирует файл...

Подсчитать сумму символов между первым и последним 'z'. Что надо изменить или дополнить? - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; int TrvacSimvoliQanaky(char , int,int); int...

Если возможно, упорядочить булевы вектора, или вывести сообщение "Вектора несравнимы" - C++
помогите пожалуйста с задачей: Даны булева вектора a и b длины n. Если возможно, упорядочить их, или вывести сообщение &quot;Вектора...

Как подсчитать сумму всех info? - C++
#include &quot;stdafx.h&quot; #include &quot;stdio.h&quot; #include &quot;stdlib.h&quot; #include &quot;math.h&quot; #include &lt;locale.h&gt; int main() { ...

Как подсчитать сумму цифр в массиве из двузначных чисел? - C++
как подсчитать сумму цифр в массиве из двузначных чисел? массив вводится в цикле от 10 до 99. помогите, пожалуйста(((

Как подсчитать сумму элементов данной последовательности через цикл? - C++
Зедение таково. Подсчитать сумму элементов последовательности: 1 + 1/2 - 2/3 + 3/4 - 4/5 +... + n-1/n ((((

20
eXPonent
99 / 52 / 2
Регистрация: 21.05.2012
Сообщений: 1,170
03.05.2017, 23:40  [ТС] #16
Цитата Сообщение от nonedark2008 Посмотреть сообщение
И я бы с осторожностью подходил к выбору алгоритмов на основе статей с хабра/википедии и т.п.
могу сделать тэст вашего вычисления хэш
и отдельно функций:
Цитата Сообщение от eXPonent Посмотреть сообщение
Ly — предложен Леонидом Юрьевым (конгруэнтный генератор)
Rs — простая хэш-функция из книги Роберта Седжвика 'Фундаментальные алгоритмы на C'
Мне самому интересно, что быстрее работает, у кого меньше коллизий и

Но основываясь на данных коллизий и теста скорости
Ly и Rs примерно равносильны
осталось сравнить с готовым алгоритмом:
Цитата Сообщение от nonedark2008 Посмотреть сообщение
В стандартной библиотеке уже есть вычисление хеша для строки std::hash<string>
Добавлено через 2 минуты
Цитата Сообщение от h3mbr0 Посмотреть сообщение
Просто к слову
а можно более простыми словами?
перевести то я перевел, только вот не понял смысла
0
h3mbr0
290 / 100 / 25
Регистрация: 12.03.2012
Сообщений: 407
03.05.2017, 23:45 #17
Цитата Сообщение от eXPonent Посмотреть сообщение
а можно более простыми словами?
перевести то я перевел, только вот не понял смысла
Краткая суть - имплементация std::hash зависит от компилятора
Могу предположить, что для твоих целей это недостаточно надежно
0
eXPonent
99 / 52 / 2
Регистрация: 21.05.2012
Сообщений: 1,170
04.05.2017, 19:55  [ТС] #18
Тут написано:
Кликните здесь для просмотра всего текста
For a quick solution involving no external libraries, you can use hash<std::string> to hash strings. It's defined by including the header files hash_map or unordered_map (or some others too).


Я так понимаю hash_map or unordered_map отличаются между собой?
т.е. в каждой из них своя реализация подсчитывания Hash?

и там же пример использования:
C++
1
2
3
4
5
6
#include <string>
#include <unordered_map>
 
hash<string> hasher;
string s = "heyho";
size_t hash = hasher(s);
Добавлено через 3 минуты
size_t и unsigned long long
я так понимаю равносильны?

Добавлено через 15 минут
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Т.е. для 64-битной программы - 64-битный хеш, для 32-битной - 32.
Вы хотите сказать, что если я запомню образцовые значения хэша на свой x64 машине, то
запустив на другой машине (EXE-файл с Runtime Library = Multi-Threaded (/MT))
Я получу другой хэш? Вместо 64-битного хеша 32-битный?
C++
1
2
3
4
5
6
#ifndef _SIZE_T_DEFINED
#ifdef  _WIN64
typedef unsigned __int64    size_t;
#else
typedef _W64 unsigned int   size_t;
#endif
А что касается моего кода?
там тоже будет урезание типов?


Добавлено через 11 минут
Вот как реализовано в VS2010 (файл xfunctional без расширения):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
template<>
    class hash<_STD string>
        : public unary_function<_STD string, size_t>
    {   // hash functor
public:
    typedef _STD string _Kty;
 
    size_t operator()(const _Kty& _Keyval) const
        {   // hash _Keyval to size_t value by pseudorandomizing transform
        size_t _Val = 2166136261U;
        size_t _First = 0;
        size_t _Last = _Keyval.size();
        size_t _Stride = 1 + _Last / 10;
 
        for(; _First < _Last; _First += _Stride)
            _Val = 16777619U * _Val ^ (size_t)_Keyval[_First];
        return (_Val);
        }
    };
Добавлено через 9 минут
Вбейте в Google:
16777619U с++ или 16777619 с++
Получите интересные результаты...

Добавлено через 6 часов 9 минут
Цитата Сообщение от MrGluck Посмотреть сообщение
У вектора нет никакой "контрольной суммы".
ЕСТЬ!
0
nonedark2008
1011 / 751 / 175
Регистрация: 28.07.2012
Сообщений: 2,089
04.05.2017, 20:49 #19
Цитата Сообщение от eXPonent Посмотреть сообщение
Я получу другой хэш? Вместо 64-битного хеша 32-битный?
Нет. Скомпилировав программу под 64-битную архитектуру, хеш будет 64-битный (sizeof(size_t) == 8). Если скомпилировать под x86, то sizeof(size_t) == 8 и следовательно хеш - 32 бита. А где запускается программа - уже не важно, если запустилась, то работать будет как и было скомпилировано. Но никто не мешает сделать свой хеш, который будет хоть 64 бита, хоть 128 или даже больше.
Цитата Сообщение от eXPonent Посмотреть сообщение
ЕСТЬ!
Нет. В стандартной библиотеке хеш для вектора не определен. А то, что по ссылке - это из библиотеки Boost, я о ней уже писал. Да и в примере, который я скидывал ранее, расчет хеша для вектора основан как раз на той пресловутой функции hash_range.

Добавлено через 6 минут
Цитата Сообщение от eXPonent Посмотреть сообщение
Вот как реализовано в VS2010 (файл xfunctional без расширения):
Если при компиляции под x64, функция будет такая же, то я не знаю, что можно сказать о надежности этой хеш-функции.
Цитата Сообщение от eXPonent Посмотреть сообщение
Я так понимаю hash_map or unordered_map отличаются между собой?
Ну, на MSDN пишут следующее:
This header is obsolete. The alternative is <unordered_map>.
Т.е. hash_map устарел, используйте unordered_map вместо него.

Добавлено через 8 минут
Цитата Сообщение от eXPonent Посмотреть сообщение
А что касается моего кода?
там тоже будет урезание типов?
Вроде нет. Как минимум свои 64 бита ты получишь на любой платформе.
1
eXPonent
99 / 52 / 2
Регистрация: 21.05.2012
Сообщений: 1,170
04.05.2017, 21:16  [ТС] #20
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Нет. Скомпилировав программу под 64-битную архитектуру, хеш будет 64-битный (sizeof(size_t) == 8).
Следовательно запустить под x86 не получится, понял.

Цитата Сообщение от nonedark2008 Посмотреть сообщение
Т.е. hash_map устарел, используйте unordered_map вместо него.
Спасибо!

Цитата Сообщение от nonedark2008 Посмотреть сообщение
Вроде нет. Как минимум свои 64 бита ты получишь на любой платформе.
Благодарю, проверю)

Добавлено через 53 секунды
Цитата Сообщение от h3mbr0 Посмотреть сообщение
Краткая суть - имплементация std::hash зависит от компилятора
Могу предположить, что для твоих целей это недостаточно надежно
Благодарю, проверю)
0
eXPonent
99 / 52 / 2
Регистрация: 21.05.2012
Сообщений: 1,170
11.05.2017, 17:44  [ТС] #21
Кому интересно саму программу я переписал
закомментировав куски кода из этого поста
Найти с исходниками можно тут:
Hash Function Efficiency v0.1 pre-Alpha (May 11th, 2017)
0
11.05.2017, 17:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.05.2017, 17:44
Привет! Вот еще темы с ответами:

Подсчитать кол-во введеных чисел, сумму положительных и сумму отрицат - C++
а тaкже oпрeделить мaксимальное и минимaльное ввeденное числo. Подтолкните на мысль коим образом выполнить сию миссию.Спасибо

Ввести двумерный массив 4*4, подсчитать кол-во (+) и (-) элементов и вывести статистику по строкам, сколько (+), сколько (-) и подсчитать общую сумму - C++
не получается никак сделать многомерный массив... помогите пожалуйста #include &lt;iostream&gt; #include &lt;ctime&gt; using namespace...

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

Как проверить контрольную сумму файла? - Безопасность
Доброго времени суток Подскажите пожалуйста, как можно проверить контрольную сумму файла? sha1 или sha2


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

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

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