|
7 / 7 / 5
Регистрация: 25.03.2018
Сообщений: 377
|
||||||
Хэширование06.11.2018, 23:42. Показов 23007. Ответов 17
Метки нет (Все метки)
Здравствуйте, вот прям вообще не понимаю, что нужно делать и что есть что и где
.1)Преобразование строкового ключа в целое число: Сложение двухбайтовых слов; после каждого сложения – циклический сдвиг суммы на один разряд влево. 2)Хеширование целочисленного ключа: Алгоритм середины квадрата. 3)Разрешение коллизий: Алгоритм двойного хеширования. Как я понимаю, нужно сначала преобр. строку, потом полученную сумму что-ли надо прогнать через хэш-функцию, и потом проверить данные хэша через АДХ, так чтоли? По 1-му пункту вроде понял:
0
|
||||||
| 06.11.2018, 23:42 | |
|
Ответы с готовыми решениями:
17
Хэширование Хэширование md5 Трай-хэширование |
|
Мозгоправ
|
||||||
| 07.11.2018, 00:32 | ||||||
|
Не прокатит.
Во-первых, в 17-й строке переменной i не существует. Это переменная, объявленная в цикле for (6-я строка). И по окончании цикла она умерает. Так говорит Стандарт. Во-вторых, из всего кода правильно написан только циклический сдвиг влево. Всё остальное - в корзину. Надо в цикле брать из строки по 2 char'а (2 байта), преобразовывать их в unsigned short ("двухбайтовое слово"), а затем суммировать с последующим циклическим сдвигом влево. Единственная сложность - обработать конец строки нечётной длины. Здесь надо аккуратно. Добавлено через 31 минуту
1
|
||||||
|
Комп_Оратор)
|
||
| 07.11.2018, 09:18 | ||
0
|
||
|
7 / 7 / 5
Регистрация: 25.03.2018
Сообщений: 377
|
|
| 07.11.2018, 10:43 [ТС] | |
|
Я правильно понима, то код для 1го пункта же?
0
|
|
|
Мозгоправ
|
|||
| 07.11.2018, 12:40 | |||
|
1
|
|||
|
7 / 7 / 5
Регистрация: 25.03.2018
Сообщений: 377
|
|
| 07.11.2018, 14:36 [ТС] | |
|
L0M, а потом что нужно? Нужно написать отдельную хэш-функцию, которая вычисляет хэш для целоч. ключа? Т.е. могу быть два разных входных данных? И потом нужно одну из этих функций прогнать через двойное хэширование?
0
|
|
|
Мозгоправ
|
||
| 07.11.2018, 17:07 | ||
|
А на счёт wchar_t, wstring и национальных алфавитов... ![]() Вы в курсе, что sizeof(wchar_t) are implementation-defined? В вашей реализации компилятора на вашей ОС на вашем железе размер wchar_t какой? И какая из Юникодных кодировок в ваш wchar_t влезает? И почему вы обходите стороной utf8, символ в которой может занимать и 6 байт? Вы под Виндой используете компилятор от Microsoft. Правильно? И свято верите, что размер wchar_t 2 байта. А Linux + gcc на том же железе считают, что размер wchar_t 4 байта. А то, что "там и кириллица представлена по-человечески" - вопрос тот ещё. Тут как бы дело не только в таблице символов (cp866, cp1251, utf8, utf16 и т.п.), но и в поддержке этой таблицы со стороны как ОС, так и пользовательского ПО. В Винде это, традиционно, жопа. Для разминки можете попробовать в консоли вывести кириллицу, представленную в программе как wide-char.
0
|
||
|
Комп_Оратор)
|
||||
| 07.11.2018, 18:51 | ||||
|
Тем не менее мы все тут свято верим в байтовый массив и си-строку. Именно эта вера возмутилась на именно двухбайтовое слово. Поэтому я и предположил широкосимвольные строки. Да, - под виндой. Потому, что преподы и студенты под ней (обычно). Я не берусь обсуждать, как о ни из под неё выглядывают, но факт есть факт. Иначе побайтово тоже неплохо было бы. Что касается:
0
|
||||
|
Мозгоправ
|
|||
| 08.11.2018, 01:13 | |||
![]() Во-первых, "слово" - оно всегда двухбайтовое (экзотические архитектуры не рассматриваем!). Это повелось ещё со времён, когда 16-битная архитектура процессоров пришла на смену 8-битной. И дожило до наших дней. В WinAPI дефайн WORD - это оно, СЛОВО: беззнаковое целое размером в 16 бит. А ещё есть дефайны DWORD - двойное слово - 32 бита и QWORD - четверное слово - 64 бита. Но вначале было слово. ![]() Правда до слова был таки байт ![]() Во-вторых, "двухбайтовое слово" - это цитата из задания ТС. ![]() Думаю (уверен), что такая формулировка задачи - плод воспалённой фантазии какого-то преподавателя, которому для 150 балбесов на потоке надо изобрести 150 разных задач примерно на одну тему. А на следующий год внести в них некоторое разнообразие, что бы осложнить копипасту следующему поколению. Препов, конечно, тоже можно понять... Но иногда встречаются такие перлы... Собственно за примерами далеко ходить не надо - достаточно пробежаться по темам этого раздела форума
0
|
|||
|
Комп_Оратор)
|
||||
| 08.11.2018, 09:12 | ||||
|
*** Вначале была бага, И бага была у Бога, И бага была - Бог. . . . До сих пор, кстати, самая мощная бага из всех сущих. Анекдот: Едут по прерии два индейца - Большой и Малый. После длительного молчания тот который Большой (Абрам, безусловно), обвёл ещё раз грустным взглядом пустыню и говорит: -"Изя, но это же не переносимо!". Изя сурово и молчаливо кивнул в ответ. Я тоже за то чтобы байт был один, в студенческих задачках с си-строками.
0
|
||||
|
7 / 7 / 5
Регистрация: 25.03.2018
Сообщений: 377
|
||||||
| 08.11.2018, 16:01 [ТС] | ||||||
|
L0M, вобщем спросил я у препода - ответил, что надо преобразовать слово в хэш, потом этот хэш прогнать через алгоритм середины квадрата, потом всё это добро полученное прогнать через алгоритм двойного хэширования.
Вот код с 1 -> 2 пунктами (создаём хэш для строк. ключа, потом преобразуется данный хэш в другой хэш через алгоритм сер. квадрата для целочисленного ключа):
0
|
||||||
|
7 / 7 / 5
Регистрация: 25.03.2018
Сообщений: 377
|
|
| 08.11.2018, 16:09 [ТС] | |
|
Алгоритм середины квадрата трактуется примерно так : Он состоит в возведении значения ключа k в квадрат (результат должен получаться
двойной длины!) и вырезании нужного числа разрядов из середины квадрата с помощью сдвига и маскирования бит. Алгоритм хорошо работает, если среди значений ключа не слишком часто встречаются числа, содержащие много нулей слева или справа
0
|
|
|
Мозгоправ
|
||||||
| 09.11.2018, 00:36 | ||||||
Сообщение было отмечено cinekst_207 как решение
Решение
Во-первых, не стоило пихать второй алгоритм в ту же функцию.
Во-вторых, вы дибо неправильно реализовали алгоритм середины квадрата, либо взяли какую-то странную трактовку. Лёгкле гугление дало два описания: чисто числовой (скорее всего это вам и надо) и позиционно-цифровой. Я сделал обе реализации. Ещё в вашем коде есть неоднозначное место: исходные строки вы считываете через >>. Если из файла нужно считывать пословно, то всё правильно, если построчно, то надо так, как в моём варианте.
1
|
||||||
|
7 / 7 / 5
Регистрация: 25.03.2018
Сообщений: 377
|
|
| 09.11.2018, 00:51 [ТС] | |
|
На счет пословно, да, он сказал, что надо пословно, иначе разрешение коллизий не будет иметь смысла, т.к. одинаковых строк (в нормальных текстах) не бывает
0
|
|
|
Мозгоправ
|
|
| 09.11.2018, 01:57 | |
|
Но коллизия - это одинаковые хеши при разных ключах.
В данной реализации наличие коллизий будет обеспечивать малая длина хеша. Подайте на вход построчно текст, длиной более 65536 уникальных строк - и присутствие хотя бы одной коллизии будет обеспечено. Но конечно со словами проще, дешевле, доступнее.
2
|
|
|
Комп_Оратор)
|
||
| 10.11.2018, 09:33 | ||
0
|
||
| 10.11.2018, 09:33 | |
|
Помогаю со студенческими работами здесь
18
Универсальное хэширование Хэширование строк MD5 хэширование Хэширование строк. c++
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|