Страница: 1 |
Вопрос: Хэш-код | Добавлено: 11.07.04 20:38 |
Автор вопроса: ![]() |
Может кому-то этот вопрос покажеться глупым, но я не знаю, что такое хэш-функции, что такое лгоритмы хэширования, хэш-таблицы. Что это такое? С чем его едят?
Например, метод GetHashCode класса System.Object возвращает код хэша текущего объекта, зачем он нужен? |
Ответы | Всего ответов: 13 |
Номер ответа: 1 Автор ответа: ![]() ![]() ![]() ![]() ![]() ICQ: 554200 Вопросов: 101 Ответов: 343 |
Профиль | Цитата | #1 | Добавлено: 12.07.04 02:15 |
Я в криптографии не силен, но попробую сказать так как сам это понимаю...
ХешФункция - функция шифрования каких-либо данных, причем используется такой алгоритм, что данные можно только зашифровать, расшифровать их уже не получится никак... АлгоритмХеширования-односторонний алгоритм шифрования данных. ХЕШ - результат, возвращаемый ХешФункцией, т.е. зашифрованные ХешАлгоритмом данные. Кстати, результат работы ХешФункции должен максимально походить на случайный набор данных... И если в исходных данных изменяется хотя бы один байт, то ХЕШ от этих данных должен измениться на 50% (это если ХешФункция хорошая). ХешТаблица - таблица, ХЕШей от разных данных. Так... теперь о том как это все работет. На примере проверки правильности пароля... 1) Пользователь вводит пароль. 2) Создается ХЕШ от пароля, т.к. сравнивать пароль со строкой в приложении не целесообразно... 3) ХЕШ от пароля сравнивется с ХЕШем(ами) из ТаблицыХешей... 4)Если ХЕШи совпали, то пароль принят, если нет, то отклонен... Что-то вроде этого... |
Номер ответа: 2 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() Администратор ICQ: 326066673 Вопросов: 368 Ответов: 5968 |
Web-сайт: Профиль | Цитата | #2 | Добавлено: 12.07.04 09:00 |
GetHashCode используется для быстрого поиска объекта в HashTable. Насколько я знаю, больше он нигде не юзается. Если интересно, поищи на gotdotnet.ru в форуме про это.. Там недавно огромнейший спор был по этому вопросу, вроде бы здесь: http://www.gotdotnet.ru/Forums/CommonForum/51356.aspx |
Номер ответа: 3 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 305396405 Вопросов: 9 Ответов: 28 |
Профиль | Цитата | #3 | Добавлено: 12.07.04 21:44 |
Спасибо! Теперь стало попонятнее. По крайней мере теперь знаю с чем это связано. |
Номер ответа: 4 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 305396405 Вопросов: 9 Ответов: 28 |
Профиль | Цитата | #4 | Добавлено: 12.07.04 23:22 |
И вот что еще.
Хотя бы примерно, расскажите как реализовывается Хэш-алгоритм (или я глубоко сунусь)? И еще пару вопросиков, почему при создании двух объектов одного и того же класса, хэш-коды у них разные, например: dim b1 as new cmyclass dim b2 as new cmyclass messagebox.show(b1.gethashcode & " " & b2.gethashcode) я получаю 2 3, а если я создаю 2 объекта типа string, например dim s1 as string = "Я" dim s2 as string = "Я" я получаю однинаковый хэш-код (176522) И еще один вопросик, пример, dim b1 as new cmyclass dim b2 as new cmyclass if system.object.equals(b1,b2)=true then messagebox.show("Эти объекты одинаковы" ![]() else messagebox.show("Эти объекты не одинаковы" ![]() end if я получаю "Эти объекты не одинаковы", не пойму, ведь эти два объекта созданы из класса cmyclass, почему они не одинаковы??? а если пишу dim s1 as string= "Я" dim s2 as string= "Я" if system.object.equals(s1,s2)=true then messagebox.show("Эти объекты одинаковы" ![]() else messagebox.show("Эти объекты не одинаковы" ![]() end if я получаю "Эти объекты одинаковы" или при сравнивании ссылок на объекты я получаю "Эти объекты одинаковы" Если кто знает почему так, объясните пожалуйста. |
Номер ответа: 5 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Вопросов: 130 Ответов: 6602 |
Профиль | Цитата | #5 | Добавлено: 13.07.04 00:32 |
В принципе в .NET два объекта, являющиеся экземплярами одного и того же класса - это разные объекты. Если ты, например, хочешь выполнить сравнение по свойствам твоего объекта, то переопредели функцию equals так, чтоб она сравнивала два объекта по определенному набору свойств. В случае с String ситуация аналогичная, но здесь проявляется умность .NET. Он видит, что ты создаешь строковую переменную с текстом "Я" и что вторую такую же, и присваивает переменным ссылки на одну и ту же строку в куче, наверное, чтоб память не расходовать, поэтмоу они являются действительно одинаковыми. Хотя, имхо, написание этой фичи не окупится сэкономленным объемом памяти ![]() |
Номер ответа: 6 Автор ответа: ![]() ![]() ![]() ![]() ![]() ICQ: 554200 Вопросов: 101 Ответов: 343 |
Профиль | Цитата | #6 | Добавлено: 13.07.04 01:10 |
>>Хотя, имхо, написание этой фичи не окупится >>сэкономленным объемом
>>памяти ![]() Эта фича, как ты выразился еще с VC6 происходит во время компиляции, а не во время выполнения программы... просто память под одинаковые строковые константы (литералы) выделяется один раз... Т.е. обе строки в данном случае берут инфу из одного и того же участка памяти... |
Номер ответа: 7 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 233286456 Вопросов: 34 Ответов: 5445 |
Web-сайт: Профиль | Цитата | #7 | Добавлено: 13.07.04 01:13 |
.НЕТ - гадость и что до нас MS в своем продукте хотела донести пусть так и останется загадкой ![]() См. Name: HashLib!.zip URL: http://cobans.net/files/HashLib!.zip Size: 186988 Create time: 10.07.2004 00:28:45 Complete time: 10.07.2004 00:31:53 Referer: Description: И не надо мне говорить что Дельфи это гшадость, сам знаю, просто скачалось нечаянно ![]() ![]() За то много всего хорошего, что можно стырить для VB брата ![]() |
Номер ответа: 8 Автор ответа: ![]() ![]() ![]() ![]() ![]() ICQ: 554200 Вопросов: 101 Ответов: 343 |
Профиль | Цитата | #8 | Добавлено: 13.07.04 01:15 |
>>Хотя бы примерно, расскажите как >>реализовывается Хэш-алгоритм (или я глубоко >>сунусь)?
Глубоко, т.к. составлением этих самых алгоритмов занимаются криптографы, а не обычные программеры... Хотя саму реализацию можно нарыть в нете, правда я не знаю где... поищи на яндексе... Про остальное тебе уже ответили, мне нечего дополнить... Насчет криптографических фишек, советую почитать Д.Скляров "Искусство защиты и взлома информации", там основы и ничего мудренного, никаких сложных алгоритмов и т.д., но зато получаешь представление о том, что есть что ![]() |
Номер ответа: 9 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() Администратор ICQ: 326066673 Вопросов: 368 Ответов: 5968 |
Web-сайт: Профиль | Цитата | #9 | Добавлено: 13.07.04 06:30 |
To All: сорри ребята, но речь идёт о чисто дотнетовских фишках, не нужно рассказывать про Hash-алгоритмы, тут говорится немного о другом ![]() To Logot: Насчёт объектов и их равенства... Если ты в своём классе не переопределил метод Equals, то используется метод Equals базового класса, а это класс Object. Вот, я не поленился декомпилировать исходники этого класса (всё же рулит, что .Net Framework - открытая штуковина, в отличие от других ![]() 'System.Object.Equals Public Overloads Shared Function Equals(ByVal objA As Object, ByVal objB As Object) As Boolean If objA = objB Then Return true End If If (objA = Nothing) OrElse (objB = Nothing) Then Return false End If Return objA.Equals(objB) End Function 'System.Object.ReferenceEquals Public Shared Function ReferenceEquals(ByVal objA As Object, ByVal objB As Object) As Boolean Return objA = objB End Function Equals вернёт True только если обе переменные ссылаются на ОДИН И ТОТ ЖЕ объект, то есть равны ссылки. Но ты имеешь право переопределить в своём классе Equals и реализовать свой алгоритм сравнения объектов. Так, например сделано в классе String - идёт сравнение по содержимому... Кстати, в String ещё компилятор помогает. Если ты задаёшь изначально две строковых переменных с одним значением, компилятор оптимизирует код и в итоге создаётся один объект String, на который ссылаются обе переменные. Метод HashCode вообще не реализован в Object... Каждый класс имеет право реализовать его так, как ему будет угодно. Можно забить на криптографию и написать свой алгоритм получения кода. Вообще, советую почитать Рихтера или Эплмана для более глубокого понимания таких вещей. |
Номер ответа: 10 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 305396405 Вопросов: 9 Ответов: 28 |
Профиль | Цитата | #10 | Добавлено: 13.07.04 23:55 |
To Павел:
>Метод HashCode вообще не реализован в Object... А как же тогда этот метод возвращает значение, если он не реализован в классе Object? Другое дело, что его можно переопределять. Кстати, где можно качнуть Рихтера или Эплмана для большего просвещения? А по ответам спасибо, в моей голове, более менее стало на свои места по хэш-коду. |
Номер ответа: 11 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() Администратор ICQ: 326066673 Вопросов: 368 Ответов: 5968 |
Web-сайт: Профиль | Цитата | #11 | Добавлено: 14.07.04 07:00 |
Но ты же напрямую классом Object Не пользуешься, а пользуешься его наследниками... Вот они и должны сами реализовывать этот GetHashCode. Насчёт книг... Эплман здесь лежит, если я его забыл удалить: http://vbnet.ru/Upgrading_Book.rar Рихтера в электронном виде я не встречал. |
Номер ответа: 12 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 305396405 Вопросов: 9 Ответов: 28 |
Профиль | Цитата | #12 | Добавлено: 14.07.04 22:27 |
Так, если не реализовывается метод GetHashCode в производном классе, то при вызове этого метода, используется метод, который релизован в классе Object, я правильно понял?
Книжку, сейчас буду просматривать. |
Номер ответа: 13 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() Администратор ICQ: 326066673 Вопросов: 368 Ответов: 5968 |
Web-сайт: Профиль | Цитата | #13 | Добавлено: 15.07.04 06:42 |
Да, именно так. |
Страница: 1 |
|