Может кому-то этот вопрос покажеться глупым, но я не знаю, что такое хэш-функции, что такое лгоритмы хэширования, хэш-таблицы. Что это такое? С чем его едят?
Например, метод GetHashCode класса System.Object возвращает код хэша текущего объекта, зачем он нужен?
Я в криптографии не силен, но попробую сказать так как сам это понимаю...
ХешФункция - функция шифрования каких-либо данных, причем используется такой алгоритм, что данные можно только зашифровать, расшифровать их уже не получится никак...
АлгоритмХеширования-односторонний алгоритм шифрования данных.
ХЕШ - результат, возвращаемый ХешФункцией, т.е. зашифрованные ХешАлгоритмом данные.
Кстати, результат работы ХешФункции должен максимально походить на случайный набор данных... И если в исходных данных изменяется хотя бы один байт, то ХЕШ от этих данных должен измениться на 50% (это если ХешФункция хорошая).
ХешТаблица - таблица, ХЕШей от разных данных.
Так... теперь о том как это все работет.
На примере проверки правильности пароля...
1) Пользователь вводит пароль.
2) Создается ХЕШ от пароля, т.к. сравнивать пароль со строкой в приложении не целесообразно...
3) ХЕШ от пароля сравнивется с ХЕШем(ами) из ТаблицыХешей...
4)Если ХЕШи совпали, то пароль принят, если нет, то отклонен...
GetHashCode используется для быстрого поиска объекта в HashTable. Насколько я
знаю, больше он нигде не юзается. Если интересно, поищи на
gotdotnet.ru в форуме про это.. Там недавно огромнейший спор был по
этому вопросу, вроде бы здесь:
http://www.gotdotnet.ru/Forums/CommonForum/51356.aspx
И вот что еще.
Хотя бы примерно, расскажите как реализовывается Хэш-алгоритм (или я глубоко сунусь)? И еще пару вопросиков, почему при создании двух объектов одного и того же класса, хэш-коды у них разные, например:
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
я получаю "Эти объекты одинаковы" или при сравнивании ссылок на объекты я получаю "Эти объекты одинаковы"
Если кто знает почему так, объясните пожалуйста.
В принципе в .NET два объекта, являющиеся экземплярами одного и того
же класса - это разные объекты.
Если ты, например, хочешь выполнить сравнение по свойствам твоего
объекта, то переопредели функцию equals так, чтоб она сравнивала два
объекта по определенному набору свойств.
В случае с String ситуация аналогичная, но здесь проявляется умность
.NET. Он видит, что ты создаешь строковую переменную с текстом "Я" и
что вторую такую же, и присваивает переменным ссылки на одну и ту же
строку в куче, наверное, чтоб память не расходовать, поэтмоу они
являются действительно одинаковыми.
Хотя, имхо, написание этой фичи не окупится сэкономленным объемом
памяти))
>>Хотя, имхо, написание этой фичи не окупится >>сэкономленным объемом
>>памяти))
Эта фича, как ты выразился еще с VC6 происходит во время компиляции, а не во время выполнения программы... просто память под одинаковые строковые константы (литералы) выделяется один раз... Т.е. обе строки в данном случае берут инфу из одного и того же участка памяти...
И не надо мне говорить что Дельфи это гшадость, сам знаю, просто скачалось нечаянно )) само ))
За то много всего хорошего, что можно стырить для VB брата
>>Хотя бы примерно, расскажите как >>реализовывается Хэш-алгоритм (или я глубоко >>сунусь)?
Глубоко, т.к. составлением этих самых алгоритмов занимаются криптографы, а не обычные программеры...
Хотя саму реализацию можно нарыть в нете, правда я не знаю где... поищи на яндексе...
Про остальное тебе уже ответили, мне нечего дополнить...
Насчет криптографических фишек, советую почитать Д.Скляров "Искусство защиты и взлома информации", там основы и ничего мудренного, никаких сложных алгоритмов и т.д., но зато получаешь представление о том, что есть что ))
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... Каждый класс имеет
право реализовать его так, как ему будет угодно. Можно забить на
криптографию и написать свой алгоритм получения кода.
Вообще, советую почитать Рихтера или Эплмана для более глубокого
понимания таких вещей.
To Павел:
>Метод HashCode вообще не реализован в Object... А как же тогда этот метод возвращает значение, если он не реализован в классе Object? Другое дело, что его можно переопределять.
Кстати, где можно качнуть Рихтера или Эплмана для большего просвещения?
А по ответам спасибо, в моей голове, более менее стало на свои места по хэш-коду.
Так, если не реализовывается метод GetHashCode в производном классе, то при вызове этого метода, используется метод, который релизован в классе Object, я правильно понял?
Книжку, сейчас буду просматривать.