Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: Хэш-код Добавлено: 11.07.04 20:38  

Автор вопроса:  Logot | ICQ: 305396405 
Может кому-то этот вопрос покажеться глупым, но я не знаю, что такое хэш-функции, что такое лгоритмы хэширования, хэш-таблицы. Что это такое? С чем его едят?
Например, метод GetHashCode класса System.Object возвращает код хэша текущего объекта, зачем он нужен?

Ответить

  Ответы Всего ответов: 13  

Номер ответа: 1
Автор ответа:
 Chill



ICQ: 554200 

Вопросов: 101
Ответов: 343
 Профиль | | #1 Добавлено: 12.07.04 02:15
Я в криптографии не силен, но попробую сказать так как сам это понимаю...

ХешФункция - функция шифрования каких-либо данных, причем используется такой алгоритм, что данные можно только зашифровать, расшифровать их уже не получится никак...

АлгоритмХеширования-односторонний алгоритм шифрования данных.

ХЕШ - результат, возвращаемый ХешФункцией, т.е. зашифрованные ХешАлгоритмом данные.

Кстати, результат работы ХешФункции должен максимально походить на случайный набор данных... И если в исходных данных изменяется хотя бы один байт, то ХЕШ от этих данных должен измениться на 50% (это если ХешФункция хорошая).

ХешТаблица - таблица, ХЕШей от разных данных.

Так... теперь о том как это все работет.

На примере проверки правильности пароля...
1) Пользователь вводит пароль.
2) Создается ХЕШ от пароля, т.к. сравнивать пароль со строкой в приложении не целесообразно...
3) ХЕШ от пароля сравнивется с ХЕШем(ами) из ТаблицыХешей...
4)Если ХЕШи совпали, то пароль принят, если нет, то отклонен...

Что-то вроде этого...

Ответить

Номер ответа: 2
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #2
Добавлено: 12.07.04 09:00
GetHashCode используется для быстрого поиска объекта в HashTable. Насколько я
знаю, больше он нигде не юзается. Если интересно, поищи на
gotdotnet.ru в форуме про это.. Там недавно огромнейший спор был по
этому вопросу, вроде бы здесь:
http://www.gotdotnet.ru/Forums/CommonForum/51356.aspx

Ответить

Номер ответа: 3
Автор ответа:
 Logot



ICQ: 305396405 

Вопросов: 9
Ответов: 28
 Профиль | | #3 Добавлено: 12.07.04 21:44
Спасибо! Теперь стало попонятнее. По крайней мере теперь знаю с чем это связано.

Ответить

Номер ответа: 4
Автор ответа:
 Logot



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
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #5 Добавлено: 13.07.04 00:32
В принципе в .NET два объекта, являющиеся экземплярами одного и того
же класса - это разные объекты.

Если ты, например, хочешь выполнить сравнение по свойствам твоего
объекта, то переопредели функцию equals так, чтоб она сравнивала два
объекта по определенному набору свойств.

В случае с String ситуация аналогичная, но здесь проявляется умность
.NET. Он видит, что ты создаешь строковую переменную с текстом "Я" и
что вторую такую же, и присваивает переменным ссылки на одну и ту же
строку в куче, наверное, чтоб память не расходовать, поэтмоу они
являются действительно одинаковыми.

Хотя, имхо, написание этой фичи не окупится сэкономленным объемом
памяти:)))

Ответить

Номер ответа: 6
Автор ответа:
 Chill



ICQ: 554200 

Вопросов: 101
Ответов: 343
 Профиль | | #6 Добавлено: 13.07.04 01:10
>>Хотя, имхо, написание этой фичи не окупится >>сэкономленным объемом
>>памяти:)))
Эта фича, как ты выразился еще с VC6 происходит во время компиляции, а не во время выполнения программы... просто память под одинаковые строковые константы (литералы) выделяется один раз... Т.е. обе строки в данном случае берут инфу из одного и того же участка памяти...

Ответить

Номер ответа: 7
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #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
Автор ответа:
 Chill



ICQ: 554200 

Вопросов: 101
Ответов: 343
 Профиль | | #8 Добавлено: 13.07.04 01:15
>>Хотя бы примерно, расскажите как >>реализовывается Хэш-алгоритм (или я глубоко >>сунусь)?
Глубоко, т.к. составлением этих самых алгоритмов занимаются криптографы, а не обычные программеры...
Хотя саму реализацию можно нарыть в нете, правда я не знаю где... поищи на яндексе...

Про остальное тебе уже ответили, мне нечего дополнить...
Насчет криптографических фишек, советую почитать Д.Скляров "Искусство защиты и взлома информации", там основы и ничего мудренного, никаких сложных алгоритмов и т.д., но зато получаешь представление о том, что есть что =)))

Ответить

Номер ответа: 9
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #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
Автор ответа:
 Logot



ICQ: 305396405 

Вопросов: 9
Ответов: 28
 Профиль | | #10 Добавлено: 13.07.04 23:55
To Павел:
>Метод HashCode вообще не реализован в Object... А как же тогда этот метод возвращает значение, если он не реализован в классе Object? Другое дело, что его можно переопределять.
Кстати, где можно качнуть Рихтера или Эплмана для большего просвещения?
А по ответам спасибо, в моей голове, более менее стало на свои места по хэш-коду.

Ответить

Номер ответа: 11
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #11
Добавлено: 14.07.04 07:00
Но ты же напрямую классом Object Не пользуешься, а пользуешься его
наследниками... Вот они и должны сами реализовывать этот GetHashCode.

Насчёт книг... Эплман здесь лежит, если я его забыл удалить:
http://vbnet.ru/Upgrading_Book.rar

Рихтера в электронном виде я не встречал.

Ответить

Номер ответа: 12
Автор ответа:
 Logot



ICQ: 305396405 

Вопросов: 9
Ответов: 28
 Профиль | | #12 Добавлено: 14.07.04 22:27
Так, если не реализовывается метод GetHashCode в производном классе, то при вызове этого метода, используется метод, который релизован в классе Object, я правильно понял?
Книжку, сейчас буду просматривать.

Ответить

Номер ответа: 13
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #13
Добавлено: 15.07.04 06:42
Да, именно так.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам