Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
10 / 10 / 5
Регистрация: 20.04.2014
Сообщений: 161
1
.NET 4.x

Хеш-функция - преобразовать массив в шестнадцатибитное число

14.06.2015, 21:03. Показов 2615. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте,задача: на входе байт массив(из любого файла),нужно высчитать хеш функцию(алгоритм формирования побитовое исключение ИЛИ пар байт исходного сообщения,размер хеш-функции 16 бит).Побитовое исключение сделал.Вопрос как дальше преобразовать данный массив в 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
25
FileStream file = new FileStream(file_to_encript,FileMode.Open,FileAccess.Read);
            int len = file_to_encript.Length;
            byte[] buf = new byte[len];
            int r = -1;
            while( r !=0)
            {
                r = file.Read(buf, 0, buf.Length);
            }
            int k=0,m=1,n=0;
            int temp, tempI;
            for(int i =0;i<buf.Length-1;i++)
            {
                if (m > buf.Length) break;
                temp = buf[(k)];
                tempI=buf[(m)];
                
               for(int j =0; j<1;j++)
                {
                    temp = temp ^ tempI;
                    buf[i] = Convert.ToByte(temp);
                }
               k++;
               m++;
              
            }
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.06.2015, 21:03
Ответы с готовыми решениями:

Хеш-функция и вывод в ассоциативный массив
Всем привет, есть функция, которая хеширует некоторую строку. Не знаю как добавить вывод пары...

Хеш-функция и вывод в ассоциативный массив
Всем привет, есть функция, которая хеширует некоторую строку. Не знаю как добавить вывод пары...

Хеш, хеш-функция, хеширование и HashMap
Снова приветствую, я начал свое знакомство с классом HashMap в Java и ввиду расхождений в разных...

Хеш-функция и хеш-таблица
Всем привет, написал хеш-функцию для строки: #include &lt;iostream&gt; //Главная библиотека #include...

7
тыжПрограммист
330 / 144 / 44
Регистрация: 21.04.2014
Сообщений: 638
14.06.2015, 21:59 2
C#
1
BitConverter.ToInt64(Твой массив,Начальный индекс в массиве)
вернёт значение типа long
0
10 / 10 / 5
Регистрация: 20.04.2014
Сообщений: 161
14.06.2015, 22:40  [ТС] 3
LonerZzz, тогда уж
C#
1
textBox1.Text = Convert.ToString(BitConverter.ToInt16(hash, 0));
раз размер 16 бит, но мы как и отрицательное число можем получить, так и не фиксированное. например "6863",что не 16 бит, поэтому и вопрос остается
0
Администратор
Эксперт .NET
17019 / 13372 / 5217
Регистрация: 17.03.2014
Сообщений: 27,342
Записей в блоге: 1
14.06.2015, 22:42 4
Лучший ответ Сообщение было отмечено Ev_Hyper как решение

Решение

Salems, по моему ты неправильно реализовал расчет т.к. значение хеша изначально должно накапливаться в переменной нужной длины. У тебя же обновляются все элементы входного массива. По идее надо считать так:
C#
1
2
3
4
5
6
7
ushort hash = 0;
int evenLength = (buf.Length/2)*2;
for (int i=0; i<evenLength; i+=2)
{
    hash ^= (ushort)(buf[i] + buf[i+1]<<8);
}
if (buf.Length % 2 == 1) hash ^= buf[buf.Length-1];
1
10 / 10 / 5
Регистрация: 20.04.2014
Сообщений: 161
14.06.2015, 22:50  [ТС] 5
OwenGlendower, больше похоже на правду,спасибо. И поясните,пожалуйста, 2 строчку: /2)*2;
0
Администратор
Эксперт .NET
17019 / 13372 / 5217
Регистрация: 17.03.2014
Сообщений: 27,342
Записей в блоге: 1
14.06.2015, 23:19 6
Salems, вторая строка выполняет округление в нижную сторону к ближайшему четному. То есть 1001 превратится в 1000. Это упрощает код цикла. Если длина файла нечетная, то последний байт обрабатывается отдельно после цикла.

Добавлено через 14 минут
Нашел ошибку в своем коде. В строке №5 надо использовать оператор побитового ИЛИ вместо сложения:
C#
1
hash ^= (ushort)(buf[i] | buf[i+1]<<8);
1
10 / 10 / 5
Регистрация: 20.04.2014
Сообщений: 161
14.06.2015, 23:56  [ТС] 7
OwenGlendower, при побитовом ИЛИ на выходе не 16 число
0
Администратор
Эксперт .NET
17019 / 13372 / 5217
Регистрация: 17.03.2014
Сообщений: 27,342
Записей в блоге: 1
15.06.2015, 02:41 8
Salems, ты что-то путаешь. Объединяя два байта с помощью сдвига и ИЛИ мы получим именно 16-и битовое число.
0
15.06.2015, 02:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.06.2015, 02:41
Помогаю со студенческими работами здесь

Функция преобразовать десятичное число в шестнадцатиричное
Излазил всё что можно не могу найти функцию преобразовать десятичное число в шестнадцатиричное....

Как преобразовать число в массив?
Мне нужно ввести шестизначное число с клавиатуры и обращаться к этому числу как к массиву, чтобы...

Преобразовать число в обратный массив
Есть число long, необходимо преобразовать пораздрядно в обратный long массив Пример: 348597 =&gt; ...

Преобразовать число в массив байт
Приветствую уважаемые форумчане, есть задача преобразовать целое число с максимальным значением...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru