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

Передача вместе с сообщением некоторого хеша - C++

Восстановить пароль Регистрация
 
Sivilan
6 / 6 / 0
Регистрация: 17.03.2013
Сообщений: 66
04.09.2013, 22:33     Передача вместе с сообщением некоторого хеша #1
При передаче информационных сообщений по каналам связи часто возникают ошибки, и получается что полученное сообщение отличается от отправленного. Для борьбы с этим применяют различные коды обнаружения ошибок, а также корректирующие коды, позволяющие исправлять наиболее вероятные ошибки. Одним из методов обнаружения ошибок является передача вместе с сообщением некоторого хеша — контрольной суммы, которую можно рассчитать для полученного сообщения и сравнить с контрольной суммой исходного сообщения.
В этой задаче вам необходимо будет реализовать коррекцию ошибок в полученном сообщении с помощью контрольной суммы, которая рассчитывается как полиномиальный хеш. Будем считать, что передается некоторая битовая строка, хранящаяся как двоичное число из n бит. Если пронумеровать биты числа с нуля, начиная с младшего, то полиномиальный хеш рассчитывается по следующей формуле:
h(a) = (a0 + a1t + a2t 2 + ... + ai t i + ... + an − 1t n − 1) mod M, где ai — i -й бит числа.
В этой задаче всегда t = 239, M = 109 + 7.
Принимающая сторона получает, возможно искаженное, сообщение и полиномиальный хеш, рассчитанный для отправленного сообщения. Считается, что сам хеш передается без ошибок. Исправление ошибок происходит по методу наибольшего правдоподобия — необходимо найти сообщение, отличающееся от полученного в минимальном числе бит, и имеющее хеш, равный полученному.
Формат входных данных
Первая строка содержит единственное число K (1 ≤ K ≤ 10) — количество переданных сообщений. Каждая из следующих K строк содержит описание переданного сообщения — три целых числа n (1 ≤ n ≤ 34) — длина сообщения, m (0 ≤ m < 2n ) — число, двоичная запись которого задает битовую строку полученного сообщения и h (0 ≤ h < 109+7) — полученный хеш.
Суммарная длина всех переданных сообщений в одном тесте не превосходит 100.
Формат выходных данных
Для каждого сообщения в отдельной строке необходимо вывести единственное число «−1», если это сообщение невозможно расшифровать, иначе необходимо сначала вывести число d — минимальное количество ошибок и далее в этой же строке d чисел — номера битов, которые были искажены при передаче. Если возможных ответов несколько, выведите любой.
Примеры
Входные данные Выходные данные
3
2 2 239
1 0 1
2 2 238
0
1 0
-1
Идея заключается в том, что необходимо отдельно посчитать хеши для всевозможных вариантов первых n/2 бит сообщения и отдельно для всевозможных вариантов остальных n − n/2 бит сообщения. В каждой половине получится максимум 217 = 131072 вариантов. Поскольку нам необходимо получить сообщение с фиксированным хешом h, то каждому варианту значения хеша для первой половины бит h1 в пару сопоставляется не более одного значения хеша для второй половины бит h2 такое, что h = (h1 + h2) mod M.
Осталось научиться для каждого варианта h1 быстро находить соответствующее значение h2. Для этого можно воспользоваться такими структурами данных, как set в C++ .И, наконец, необходимо из всех найденных пар подходящих значений h1 и h2 выбрать ту, в которой изменилось минимальное число бит по сравнению с принятым сообщением m.Помогите с кодом
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.09.2013, 22:33     Передача вместе с сообщением некоторого хеша
Посмотрите здесь:

C++ Сайт откр. с сообщением
C++ Независимость процессов и Закрытие окна с сообщением
C++ Изменение некоторого символа в массиве
C++ Окошко с сообщением "Hello".
C++ Создать шаблон некоторого класса, возможно, реализованного с применением некоторого серверного класса
Список. Программа вылетает с сообщением "Необработанное исключение" C++
C++ Число вхождений некоторого буквосочетания в предложение
Рассчитать частичную сумму до некоторого знака C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Sue405090
5 / 5 / 1
Регистрация: 15.08.2013
Сообщений: 90
05.09.2013, 09:28     Передача вместе с сообщением некоторого хеша #2
может как то поможет
C#
1
2
3
4
5
6
7
8
9
10
11
12
 private string ComputeFilesMD5(string path)//хеш файла
        {
            using (FileStream fs = File.OpenRead(path))
            {
                MD5 md5 = new MD5CryptoServiceProvider();
                byte[] filebytes = new byte[fs.Length];
                fs.Read(filebytes, 0, (int)fs.Length);
                byte[] Sum = md5.ComputeHash(filebytes);
                string result = BitConverter.ToString(Sum).Replace("-", String.Empty);
                return result;
            }
        }
Yandex
Объявления
05.09.2013, 09:28     Передача вместе с сообщением некоторого хеша
Ответ Создать тему
Опции темы

Текущее время: 07:39. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru