рдЬрд╣рд╛рдВ GetHashCode рдХреЗ .NET рд╣рд╛рде рдмрдврд╝ рд░рд╣реЗ рд╣реИрдВ

рдкрд░рд┐рдЪрдп


рдпрд╣ рдЖрд▓реЗрдЦ .NET рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рд╣реИрд╢ рдХреЛрдб рдХреА рдкреАрдврд╝реА рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИред рд╡рд┐рд╖рдп рдХрд╛рдлреА рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рд╕реНрд╡рд╛рднрд┐рдорд╛рдиреА .NET рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдпрд╣ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рд┐рдПред рддреЛ рдЪрд▓рд┐рдП!

рдЙрдирдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рдХреНрдпрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?


рд╣рдо рдЕрдкрдиреЗ рд▓реЗрдЦ рдХреЛ рдЙрдирдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдПрдХ рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдХреЗ рд╕реАрдЦрддреЗ рд╣реИрдВред

рдПрдХ рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ рддрдерд╛рдХрдерд┐рдд рд╣реЗрдбрд░ (рд╣реЗрдбрд░) рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рджреЛ рдлрд╝реАрд▓реНрдб рд╣реЛрддреЗ рд╣реИрдВ: рдПрдХ рд╕рдВрдХреЗрддрдХ рдЬрд┐рд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ (рдореЗрдереЛрдбреЗрдмрд▓ рдкреЙрдЗрдВрдЯрд░), рд╕рд╛рде рд╣реА рдПрдХ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдЗрдВрдбреЗрдХреНрд╕ (SyncBlockIndex)ред

рд╡реЗ рдХрд┐рд╕ рд▓рд┐рдП рд╣реИрдВ?

рдкрд╣рд▓рд╛ рдлрд╝реАрд▓реНрдб рдЖрд╡рд╢реНрдпрдХ рд╣реИ рддрд╛рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдмрдВрдзрд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХреЗ, рдЕрд░реНрдерд╛рдд, рдЖрдк рдПрдХ рдХреЗ рдмрд╛рдж рдПрдХ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рд╕реВрдЪрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░реЗрд╖рдг рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред Object.GetType рд╡рд┐рдзрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ MethodTablePointer рдкреЙрдЗрдВрдЯрд░ рд▓реМрдЯрд╛рддреА рд╣реИред

рджреВрд╕рд░рд╛ рдХреНрд╖реЗрддреНрд░ рдПрдХ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЕрд░реНрдерд╛рддреН, рддрд╛рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╡рд╕реНрддреБ рдХреЛ рдереНрд░реЗрдб-рд╕реБрд░рдХреНрд╖рд┐рдд рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред

рдЬрдм CLR рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рддрдерд╛рдХрдерд┐рдд рдкреВрд▓ рдмрдирд╛рддрд╛ рд╣реИ, рдЖрдк рдЗрди рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдмреНрд▓реЙрдХреЛрдВ рдХреА рд╕рд╛рдорд╛рдиреНрдп рд╕рд░рдгреА рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВред рдЬрдм рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рдпрд╣ рдореЙрдирд┐рдЯрд░.рдЗрдВрдЯрд░ рд╡рд┐рдзрд┐ рдпрд╛ C # рд▓реЙрдХ рднрд╛рд╖рд╛ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ), рд╕реАрдПрд▓рдЖрд░ рдЕрдкрдиреА рд╕реВрдЪреА рдореЗрдВ рдПрдХ рдореБрдХреНрдд рддреБрд▓реНрдпрдХрд╛рд▓рди рдмреНрд▓реЙрдХ рдХреА рддрд▓рд╛рд╢ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЗрдбрд░ рдореЗрдВ рдЙрд╕реА рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЕрдкрдирд╛ рд╕реВрдЪрдХрд╛рдВрдХ рд▓рд┐рдЦрддрд╛ рд╣реИред рдЬреИрд╕реЗ рд╣реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдПрдХ рдорд▓реНрдЯреАрдереНрд░реЗрдбреЗрдб рд╡рд╛рддрд╛рд╡рд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд╕реАрдПрд▓рдЖрд░ рдХреЗрд╡рд▓ рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП -1 рдХрд╛ рдорд╛рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рддрд░рд╣ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдмреНрд▓реЙрдХ рдХреЛ рдореБрдХреНрдд рдХрд░рддрд╛ рд╣реИред

рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдмреНрд▓реЙрдХ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ C ++ рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦрдВрдбреЛрдВ рдХрд╛ рдПрдХ рдирдпрд╛ рдЕрд╡рддрд╛рд░ рд╣реИрдВред рд╕реАрдПрд▓рдЖрд░ рдХреЗ рд░рдЪрдирд╛рдХрд╛рд░реЛрдВ рдиреЗ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдмрдВрдзрд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдиреБрднрд╛рдЧ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдмрд╣реБрдд рдорд╣рдВрдЧрд╛ рд╣реЛрдЧрд╛, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдХ рдорд▓реНрдЯреАрдереНрд░реЗрдбреЗрдб рд╡рд╛рддрд╛рд╡рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

рд╕реНрдерд┐рддрд┐ рдХреА рдмреЗрд╣рддрд░ рд╕рдордЭ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрди рдЪрд┐рддреНрд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:


рдЪрд┐рддреНрд░ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ ObjectA рдФрд░ ObjectB рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХрд╛ MethodTablePointer рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред ObjectC рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИред рдпрд╣ рднреА рджреЗрдЦрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ ObjectA рдФрд░ ObjectC рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдмреНрд▓реЙрдХ рдХреЗ рдПрдХ рдкреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд, рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд╡рд╛рддрд╛рд╡рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред ObjectB рдЕрдкрдиреЗ SyncBlockIndex = -1 рдХреЗ рдмрд╛рдж рд╕реЗ рдкреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдЕрдм рд╣рдордиреЗ рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХрд┐ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдХреИрд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдо рд╣реИрд╢ рдХреЛрдб рдХреА рдкреАрдврд╝реА рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

GetHashCode рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ


рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ GetHashCode рд╡рд┐рдзрд┐ рдПрдХ рдкреНрд░рдмрдВрдзрд┐рдд рд╣реАрдк рдореЗрдВ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдкрддрд╛ рд▓реМрдЯрд╛рддреА рд╣реИ рдПрдХ рдорд┐рдердХ рд╣реИред рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛, рдЗрд╕рдХреА рдЕрд╕рдВрдЧрддрддрд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдХрд░реНрддрд╛, рдвреЗрд░ рдХреЛ рд╕рдВрдХреБрдЪрд┐рдд рдХрд░рдирд╛, рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рддрджрдиреБрд╕рд╛рд░ рд╕рднреА рдХреЗ рдкрддреЗ рдмрджрд▓рддрд╛ рд╣реИред

рдпрд╣ рд╡реНрдпрд░реНрде рдирд╣реАрдВ рдерд╛ рдХрд┐ рдореИрдВрдиреЗ рдЖрд░реНрдЯрд┐рдХрд▓ рдХреЛ рд╕рд┐рдВрдХрдмрд▓реЙрдХ рдХреЗ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ, рдХреБрдЫ рд╕рд┐рдВрдХрдмреНрд▓реЙрдХ рдХреЗ рдлреНрд░реА рдЗрдВрдбреЗрдХреНрд╕ рдХреЛ рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реИрд╢ рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, .NET 1.0 рдФрд░ .NET 1.1 рдореЗрдВ, GetHashCode рдкрджреНрдзрддрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рд╕рд┐рдВрдХрдмрд▓реЙрдХ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдЗрдВрдбреЗрдХреНрд╕ рдореЗрдВ рд╕рд┐рдВрдХрдмрд▓реЙрдХрдЖрдИрдВрдбреЗрдХреНрд╕ рдлрд╝реАрд▓реНрдб рдореЗрдВ рдирд┐рд░реНрдорд╛рдг рд╣реЛрддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╕рдордЭрддреЗ рд╣реИрдВ, рдпрд╣ рдПрдХ рд╣реИрд╢ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЖрдВрддрд░рд┐рдХ рд╕рдВрд░рдЪрдирд╛рдПрдВ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИрдВ рдЬреЛ рд╕реНрдореГрддрд┐ + рд╕рдордп рдХреЛ рдЕрдкрдиреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдмрд░реНрдмрд╛рдж рдХрд░ рджреЗрддреА рд╣реИрдВ, рджреВрд╕рд░реЗ, рд╣реИрд╢ рдХреЛрдб рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдЬрд╛рдПрдВрдЧреЗ, рдЕрд░реНрдерд╛рдд, рд╡реЗ рдЕрдиреБрдорд╛рдирд┐рдд рд╣реЛрдВрдЧреЗред рдпрд╣рд╛рдВ рдПрдХ рдмреНрд▓реЙрдЧ рдХрд╛ рд▓рд┐рдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕реАрдПрд▓рдЖрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЦрд░рд╛рдм рд╣реИ рдФрд░ рд╡реЗ рдЗрд╕реЗ рдЕрдЧрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдмрджрд▓ рджреЗрдВрдЧреЗред

.NET 2.0 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░, рд╣реИрд╢ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдмрджрд▓ рдЧрдпрд╛ рд╣реИред рдЕрдм рдпрд╣ рдереНрд░реЗрдб рдХреЗ рдкреНрд░рдмрдВрдзрди рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╡рд┐рдзрд┐ рдЪрд▓рддреА рд╣реИред рдпрджрд┐ рдЖрдк SSCLI20 рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡рд┐рдзрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рджрд┐рдЦрддреА рд╣реИ:

inline DWORD GetNewHashCode() { // Every thread has its own generator for hash codes so that we won't get into a situation // where two threads consistently give out the same hash codes. // Choice of multiplier guarantees period of 2**32 - see Knuth Vol 2 p16 (3.2.1.2 Theorem A) DWORD multiplier = m_ThreadId*4 + 5; m_dwHashCodeSeed = m_dwHashCodeSeed*multiplier + 1; return m_dwHashCodeSeed; } 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкреНрд░рддреНрдпреЗрдХ рдереНрд░реЗрдб рдХрд╛ рдЕрдкрдирд╛ рд╣реИрд╢ рдЬрдирд░реЗрдЯрд░ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рдЬрд╣рд╛рдВ рджреЛ рд╕реВрддреНрд░ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рд╕рдорд╛рди рд╣реИрд╢ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВред

рдкрд╣рд▓реЗ рдХреА рддрд░рд╣, рд╣реИрд╢ рдХреЛрдб рдХреА рдЧрдгрдирд╛ рдПрдХ рдмрд╛рд░ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЗрдбрд░ рдореЗрдВ рд╕рд┐рдВрдХрдмреНрд▓реЙрдХрдЗрдВрдбреЗрдХреНрд╕ рдлрд╝реАрд▓реНрдб (рдпрд╣ рдПрдХ рд╕реАрдПрд▓рдЖрд░ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рд╣реИ) рдореЗрдВ рдХреА рдЬрд╛рддреА рд╣реИред рдЕрдм рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдЧрд░ GetHashCode рдкрджреНрдзрддрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣рдореЗрдВ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдЗрд╕реЗ рдХрд╣рд╛рдВ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдирд╛ рд╣реИ? рдФрд░ рд╣реИрд╢ рдХреЛрдб рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ?

рдЗрди рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рдХреЗ рд▓рд┐рдП, рд╕рд┐рдВрдХрдмреНрд▓реЙрдХ рдХреА рд╕рдВрд░рдЪрдирд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред


рдЬрдм GetHashCode рд╡рд┐рдзрд┐ рдХреЛ рдкрд╣рд▓реА рдмрд╛рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, CLR рд╣реИрд╢ рдХреЛрдб рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ SyncBlockIndex рдлрд╝реАрд▓реНрдб рдореЗрдВ рджрд░реНрдЬ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ SyncBlock рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рдпрд╛рдиреА SyncBlockIndex рдлрд╝реАрд▓реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ CLR рд╣реИрд╢ рдХреЛрдб рдХреЛ рд╕рд┐рдВрдХрдмреНрд▓реЙрдХ рдореЗрдВ рд╕реНрд╡рдпрдВ рд▓рд┐рдЦрддрд╛ рд╣реИ, рдпрд╣ рдЖрдВрдХрдбрд╝рд╛ рд╕рд┐рдВрдХрд╣реЙрдХ рдореЗрдВ рд╕реНрдерд╛рди рдХреЛ рд╣реИрд╢ рдХреЛрдб рдХреЗ рднрдВрдбрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рджрд┐рдЦрд╛рддрд╛ рд╣реИред рдЬреИрд╕реЗ рд╣реА рд╕рд┐рдВрдХрдмреНрд▓реЙрдХ рдХреЛ рдореБрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕реАрдПрд▓рдЖрд░ рдЕрдкрдиреЗ рд╢рд░реАрд░ рд╕реЗ рд╣реИрд╢ рдХреЛрдб рдХреЛ рд╕рд┐рдВрдХрдмреНрд▓реЙрдХрдЗрдВрдбреЗрдХреНрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╣реЗрдбрд░ рдореЗрдВ рдХреЙрдкреА рдХрд░ рджреЗрддрд╛ рд╣реИред рд╡рд╣ рд╕рдм рд╣реИред

GetHashCode рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ


рдЕрдм рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ GetHashCode рдкрджреНрдзрддрд┐ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИред рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдХрд╛рдлреА рджрд┐рд▓рдЪрд╕реНрдк рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдкрд╣рд▓реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╕реАрдПрд▓рдЖрд░ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╣рдореЗрд╢рд╛ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЬрд▓реНрджреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣рдореЗрд╢рд╛ рдЖрдкрдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕реАрдПрд▓рдЖрд░ рдХреЗ рдкрд╛рд╕ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЧреЗрдЯрд╣реИрд╢рдХреЛрдб рдкрджреНрдзрддрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рджреЛ рд╕рдВрд╕реНрдХрд░рдг рд╣реИрдВ, рдФрд░ рдХрд┐рд╕ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрд╡рдпрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред

рдкрд╣рд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг:
рдпрджрд┐ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╕рдВрджрд░реНрдн рдлрд╝реАрд▓реНрдб рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рдЗрд╕рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдмреАрдЪ рдХреЛрдИ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рднреА рдирд╣реАрдВ рд╣реИ, рддреЛ GetHashCode рд╡рд┐рдзрд┐ рдХрд╛ рддреЗрдЬрд╝ рд╕рдВрд╕реНрдХрд░рдг рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реАрдПрд▓рдЖрд░ рд╕рд┐рд░реНрдл рдПрдХреНрд╕рдЖрд░ рд╣реИ - рдпрд╣ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╣рд░ 4 рдмрд╛рдЗрдЯреНрд╕ рд╣реИ рдФрд░ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╣реИрд╢ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрд░рдЪрдирд╛ рдХреА рдкреВрд░реА рд╕рд╛рдордЧреНрд░реА рд╢рд╛рдорд┐рд▓ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдмреВрд▓ рдФрд░ рдЗрдВрдЯ рдХрд╛ рдПрдХ рдХреНрд╖реЗрддреНрд░ рд╣реЛрддрд╛ рд╣реИ, рдореЗрдВ 3 рдмрд╛рдЗрдЯреНрд╕ рдХрд╛ рдПрдХ рдирд┐рд╢реБрд▓реНрдХ рд╕реНрдерд╛рди рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рдЬреЗрдЖрдИрдЯреА рдлрд╝реАрд▓реНрдб рд░рдЦрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЙрдиреНрд╣реЗрдВ 4 рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП, рд╣реИрд╢ рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреВрд╕рд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рд╡реИрд╕реЗ, рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдПрдХ рдмрдЧ рдерд╛ рдЬреЛ рдХреЗрд╡рд▓ .NET 4 рдореЗрдВ рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕рдореЗрдВ рдпрд╣ рддрдереНрдп рд╢рд╛рдорд┐рд▓ рдерд╛ рдХрд┐ рджрд╢рдорд▓рд╡ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╣реИрд╢ рдХреЛрдб рдХреА рд╕рд╣реА рдЧрдгрдирд╛ рдирд╣реАрдВ рдХреА рдЧрдИ рдереАред

рдХреЛрдб рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ

 decimal d1 = 10.0m; decimal d2 = 10.00000000000000000m; 

рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдбреА 1 рдФрд░ рдбреА 2 рдмрд░рд╛рдмрд░ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдХреА рдмрд┐рдЯ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЕрд▓рдЧ рд╣реИрдВ (рджрд╢рдорд▓рд╡ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреА рдкреНрд░рдХреГрддрд┐ рдХреЗ рдХрд╛рд░рдг)ред рдФрд░ рдЪреВрдВрдХрд┐ CLR xor рд╣рд░ 4 рдмрд╛рдЗрдЯреНрд╕ рдХрд╛ рд╣реЛрддрд╛ рд╣реИ (рдЬрд┐рдирдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ 4 рдмрд╛рдЗрдЯреНрд╕ рд╣реЛрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рджрд╢рдорд▓рд╡ рдореЗрдВ 16 рдмрд╛рдЗрдЯреНрд╕ рд╣реЛрддреЗ рд╣реИрдВ), рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИрд╢ рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВред рд╡реИрд╕реЗ, рдпрд╣ рдмрдЧ рди рдХреЗрд╡рд▓ рджрд╢рдорд▓рд╡ рдореЗрдВ, рдмрд▓реНрдХрд┐ рдХрд┐рд╕реА рднреА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рднреА рдкреНрд░рдХрдЯ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рд╣реИрд╢ рдХреЛрдб рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреЗрдЬрд╝ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рджреВрд╕рд░рд╛ рд╕рдВрд╕реНрдХрд░рдг:
рдпрджрд┐ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╕рдВрджрд░реНрдн рдлрд╝реАрд▓реНрдб рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдпрд╛ рдЗрд╕рдХреЗ рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЗ рдмреАрдЪ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рд╣реИ, рддреЛ рд╡рд┐рдзрд┐ рдХрд╛ рдПрдХ рдзреАрдорд╛ рд╕рдВрд╕реНрдХрд░рдг рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реАрдПрд▓рдЖрд░ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдкрд╣рд▓реЗ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдпрд╣ рдПрдХ рд╣реИрд╢ рдХреЛрдб рдмрдирд╛рддрд╛ рд╣реИред рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ, рдпрд╣ рдлрд╝реАрд▓реНрдб рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЯрд╛рдЗрдк рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА, рдЕрдиреНрдпрдерд╛ рдЬрдм рдЗрд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣реИрд╢ рдХреЛрдб рднреА рдмрджрд▓ рдЬрд╛рдПрдЧрд╛, рдФрд░ рд╣рдо рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЕрдкрдиреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЦреЛрдЬрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ рдпрджрд┐ рдпрд╣ рдПрдХ рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдкрд╣рд▓рд╛ рдХреНрд╖реЗрддреНрд░ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рд╣реИ, рддреЛ рдпрд╣ рдЧреЗрдЯрд╣реИрд╢рдХреЛрдб рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдирдХ рддрд░реНрдХ рдХреЛ рддреЛрдбрд╝ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдФрд░ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдкрд░рд╕реНрдкрд░ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред CLR xor-it рд╣реИрд╢ рдХреЛрдб рдЗрд╕ рдлреАрд▓реНрдб рдХреЗ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд╕рд╛рде рдЗрд╕ рдлреАрд▓реНрдб рдХреЗ рдкреНрд░рдХрд╛рд░ (рдореЗрдердбрдЯреЗрдмрд▓ рдкреЙрдЗрдВрдЯрд░)ред рд╕реАрдПрд▓рдЖрд░ рд╕реНрдерд┐рд░ рдХреНрд╖реЗрддреНрд░реЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рд╕реНрдерд┐рд░ рдХреНрд╖реЗрддреНрд░ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдХреНрд╖реЗрддреНрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╣рдо рдЕрдирдВрдд рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореЗрдВ рдкрдбрд╝ рдЬрд╛рддреЗ рд╣реИрдВред

CLR рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╡реИрд▓реНрдпреВ рдЯрд╛рдЗрдк рдХреЗ рдЧреЗрдЯрд╣реИрд╢рдХреЛрдб рд╡рд┐рдзрд┐ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рддреЗ рд╣реИрдВ:
 /*=================================GetHashCode================================== ** Action: Our algorithm for returning the hashcode is a little bit complex. We look ** for the first non-static field and get it's hashcode. If the type has no ** non-static fields, we return the hashcode of the type. We can't take the ** hashcode of a static member because if that member is of the same type as ** the original type, we'll end up in an infinite loop. **Returns: The hashcode for the type. **Arguments: None. **Exceptions: None. ==============================================================================*/ [MethodImplAttribute(MethodImplOptions.InternalCall)] public extern override int GetHashCode(); // Note that for correctness, we can't use any field of the value type // since that field may be mutable in some way. If we use that field // and the value changes, we may not be able to look up that type in a // hash table. For correctness, we need to use something unique to // the type of this object. // HOWEVER, we decided that the perf of returning a constant value (such as // the hash code for the type) would be too big of a perf hit. We're willing // to deal with less than perfect results, and people should still be // encouraged to override GetHashCode. 


рдЯрд┐рдкреНрдкрдгреА

рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдЕрдкрдиреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдлрд╝реАрд▓реНрдб рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗред рдЕрд░реНрдерд╛рддреН, рдирд┐рдореНрди рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛:

 public struct Node { int data; Node node; } 

рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╕рдВрд░рдЪрдирд╛ рд╢реВрдиреНрдп рдорд╛рди рдирд╣реАрдВ рд▓реЗ рд╕рдХрддреА рд╣реИред рдирд┐рдореНрди рдХреЛрдб рдкреБрд╖реНрдЯрд┐ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ:

 var myNode = new Node(); myNode.node.node.node.node.node.node.node.node.node....... 

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрдерд┐рд░ рдХреНрд╖реЗрддреНрд░ рдХрд╛рдлреА рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХрд▓ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВред рдЕрд░реНрдерд╛рддреН, рдирд┐рдореНрди рдХреЛрдб рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдорд╛рдиреНрдп рд╣реИред

 public struct Node { int data; static Node node; } 

рдЯрд┐рдкреНрдкрдгреА

рд╕реНрдерд┐рддрд┐ рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

 var k1 = new KeyValuePair<int, int>(10, 29); var k2 = new KeyValuePair<int, int>(10, 31); Console.WriteLine("k1 - {0}, k2 - {1}", k1.GetHashCode(), k2.GetHashCode()); var v1 = new KeyValuePair<int, string>(10, "abc"); var v2 = new KeyValuePair<int, string>(10, "def"); Console.WriteLine("v1 - {0}, v2 - {1}", v1.GetHashCode(), v2.GetHashCode()); 

рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдХреЛрдИ рд╕рдВрджрд░реНрдн рдлрд╝реАрд▓реНрдб рдирд╣реАрдВ рд╣реИ рдФрд░ рдлрд╝реАрд▓реНрдб рдХреЗ рдмреАрдЪ рдХреЛрдИ рдЦрд╛рд▓реА рджреВрд░реА рдирд╣реАрдВ рд╣реИ, рдЪреВрдВрдХрд┐ рдЗрдВрдЯ рдлрд╝реАрд▓реНрдб 4 рдмрд╛рдЗрдЯреНрд╕ рд▓реЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдлрд╛рд╕реНрдЯ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реИрд╢ рдХреЛрдб рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдпрд╣ рдХрдВрд╕реЛрд▓ рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдЧрд╛:

k1 - 411217769, k2 - 411217771

рджреВрд╕рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдПрдХ рд╕рдВрджрд░реНрдн рдХреНрд╖реЗрддреНрд░ (рд╕реНрдЯреНрд░рд┐рдВрдЧ) рд╣реИ, рдЗрд╕рд▓рд┐рдП рдзреАрдореА рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред CLR рд╣реИрд╢ рдХреЛрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝реАрд▓реНрдб рдХреЗ рд░реВрдк рдореЗрдВ int рдХреЗ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдлрд╝реАрд▓реНрдб рдХреЛ рдХреЗрд╡рд▓ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдВрд╕реЛрд▓ рдкрд░ рдЖрдЙрдЯрдкреБрдЯ рд╣реЛрдЧрд╛:

v1 - 411217780, рд╡реА 2 - 411217780

рдЕрдм рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╕реАрдПрд▓рдЖрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреНрдпреЛрдВ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдорд╣рддреНрд╡рдкреВрд░реНрдг рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ (рдФрд░ рди рдХреЗрд╡рд▓ рдорд╣рддреНрд╡рдкреВрд░реНрдг, рдмрд▓реНрдХрд┐ рд╕рднреА) рдЧреЗрдЯрд╣реИрд╢рдХреЛрдб рд╡рд┐рдзрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдмрд╣реБрдд рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдЧрд▓рддрдлрд╣рдореА рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╣реИрд╢ рдХреЛрдб рд╕рдорд╛рди рдХреНрдпреЛрдВ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рджреВрд╕рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВред

рдпрджрд┐ рдЖрдк GetHashCode рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдкрд░ рдПрдХ рдмрдбрд╝реА рд╣рд┐рдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

GetHashCode рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?


рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреНрд▓рд╛рд╕ GetHashCode рдкрджреНрдзрддрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддреА рд╣реИред .NET 4.5 рдореЗрдВ рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

GetHashCode X64
 public override unsafe int GetHashCode() { if (HashHelpers.s_UseRandomizedStringHashing) return string.InternalMarvin32HashString(this, this.Length, 0L); fixed (char* chPtr1 = this) { int num1 = 5381; int num2 = num1; char* chPtr2 = chPtr1; int num3; while ((num3 = (int) *chPtr2) != 0) { num1 = (num1 << 5) + num1 ^ num3; int num4 = (int) chPtr2[1]; if (num4 != 0) { num2 = (num2 << 5) + num2 ^ num4; chPtr2 += 2; } else break; } return num1 + num2 * 1566083941; } } 


рдпрд╣ 64-рдмрд┐рдЯ рдорд╢реАрди рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ

GetHashCode
 public int GetHashCode() { #if FEATURE_RANDOMIZED_STRING_HASHING if(HashHelpers.s_UseRandomizedStringHashing) { return InternalMarvin32HashString(this, this.Length, 0); } #endif // FEATURE_RANDOMIZED_STRING_HASHING unsafe { fixed (char* src = this) { #if WIN32 int hash1 = (5381<<16) + 5381; #else int hash1 = 5381; #endif int hash2 = hash1; #if WIN32 // 32 bit machines. int* pint = (int *)src; int len = this.Length; while (len > 2) { hash1 = ((hash1 << 5) + hash1 + (hash1 >> 27)) ^ pint[0]; hash2 = ((hash2 << 5) + hash2 + (hash2 >> 27)) ^ pint[1]; pint += 2; len -= 4; } if (len > 0) { hash1 = ((hash1 << 5) + hash1 + (hash1 >> 27)) ^ pint[0]; } #else int c; char* s = src; while ((c = s[0]) != 0) { hash1 = ((hash1 << 5) + hash1) ^ c; c = s[1]; if (c == 0) break; hash2 = ((hash2 << 5) + hash2) ^ c; s += 2; } #endif return hash1 + (hash2 * 1566083941); } } } 


рдлрд┐рд░ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ 32 рдпрд╛ 64 рдмрд┐рдЯ рдорд╢реАрди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдорддрднреЗрдж рд╣реИрдВред

рдпрд╣ рдХрд╣рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ .NET рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд╕рд╛рде рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрджрд▓рддрд╛ рд╣реИред рдЗрд╕реЗ рдПрд░рд┐рдХ рд▓рд┐рдкрд░реНрдЯ рдиреЗ рд▓рд┐рдЦрд╛ рдерд╛ред рдЙрдиреНрд╣реЛрдВрдиреЗ рдЪреЗрддрд╛рд╡рдиреА рджреА рдХрд┐ рд╣рдорд╛рд░рд╛ рдХреЛрдб рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕реНрдЯреЛрд░ рд╣реИрд╢ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдпрд╛ рдбрд┐рд╕реНрдХ рдореЗрдВ рдорд╛рдирдХ рдкрде рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ .NET рдХреА рдЕрдЧрд▓реА рд░рд┐рд▓реАрдЬ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмрджрд▓рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд░рдЦрддреЗ рд╣реИрдВред рддреЛ рдпрд╣ .NET рдХреЗ рдЕрдВрддрд┐рдо 4 рд░рд┐рд▓реАрдЬ рдХреЗ рджреМрд░рд╛рди рд╣реБрдЖред

рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рдХрд╛рд░ рдкрд░ рд╣реИрд╢рд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдХреИрд╢рд┐рдВрдЧ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рд╣рд░ рдмрд╛рд░ рдЬрдм рд╣рдо GetHashCode рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╣реИрд╢ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд░рд┐рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗред рдПрд░рд┐рдХ рд▓рд┐рдкрд░реНрдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдпрд╣ рд╕реНрдореГрддрд┐ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рдХрд╛рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд 4 рдмрд╛рдЗрдЯреНрд╕ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИред рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрд╣реБрдд рддреЗрдЬрд╝ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд╣реА рд╕рдорд╛рдзрд╛рди рд╣реИред

рдпрджрд┐ рдЖрдк рдзреНрдпрд╛рди рджреЗрдВ, GetHashCode рдкрджреНрдзрддрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╡рд╣ рдХреЛрдб рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ рдЬреЛ рдкрд╣рд▓реЗ рдореМрдЬреВрдж рдирд╣реАрдВ рдерд╛:

 if (HashHelpers.s_UseRandomizedStringHashing) return string.InternalMarvin32HashString(this, this.Length, 0L); 

рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ .NET 4.5 рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдбреЛрдореЗрди рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд▓рд┐рдП рд╣реИрд╢ рдХреЛрдб рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╡рд┐рд╢реЗрд╖рддрд╛ рдорд╛рди рдХреЛ 1 рдкрд░ рд╕реЗрдЯ рдХрд░рдХреЗ, рдЙрд╕ рдбреЛрдореЗрди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╣реИрд╢ рдХреЛрдб рдХреА рдЧрдгрдирд╛ рд╕рдВрднрд╡ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╡рд┐рдзрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЕрд▓рдЧ-рдЕрд▓рдЧ рдбреЛрдореЗрди рдореЗрдВ рдПрдХ рд╣реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИрд╢ рдХреЛрдб рд╣реЛрдВрдЧреЗред рдЗрд╕ рд╣реИрд╢ рдХреЛрдб рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рдзрд┐ рдЧреБрдкреНрдд рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЦреБрд▓рд╛рд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдХреИрд╕реЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ


рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП GetHashCode рдкрджреНрдзрддрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдЗрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдорд▓реНрдЯреАрдХрд╛рд╕реНрдЯрдбреЗрдЧреЗрдЯ рд╡рд░реНрдЧ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╡рд░реНрдЧ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред рдпрд╣ рдкрджрд╛рдиреБрдХреНрд░рдо рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рд░реВрдк рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рд╣реБрдЖ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рд╡рд░реНрдЧ рдорд▓реНрдЯреАрдХрд╛рд╕реНрдЯрдбреЗрд▓реЗрдЧреЗрдЯ рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдбреЗрд▓реАрдЧреЗрдЯ рд╡рд░реНрдЧ рдореЗрдВ GetHashCode рдкрджреНрдзрддрд┐ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ

 public override int GetHashCode() { return this.GetType().GetHashCode(); } 

рдпрд╣ рд╣реИ, рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдкреНрд░рдХрд╛рд░ рд╣реИрд╢ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдХреЙрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рд╡рд╛рд▓реЗ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╣рдореЗрд╢рд╛ рдПрдХ рд╣реА рд╣реИрд╢ рдХреЛрдб рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЕрд░реНрдерд╛рдд, рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ рдмреБрд▓рд╛рдиреЗ рд╕реЗ рдХрдИ рддрд░реАрдХреЗ рдХрд╣рд▓рд╛рдПрдВрдЧреЗ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдХреЗ рдкрд╛рд╕ рддрд░реАрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рдПрдХ рд╣реИрд╢ рдХреЛрдб рд╣реЛрдЧрд╛, рдЬреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП, MulticastDelegate рдореЗрдВ, GetHashCode рдкрджреНрдзрддрд┐ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкреБрдирд░реНрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рд╢рд╛рдорд┐рд▓ рд╣реЛред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрджрд┐ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдЕрднреА рднреА рд╕рдорд╛рди рд╣реИрдВ, рддреЛ рд╣реИрд╢ рдХреЛрдб рд╕рдорд╛рди рд╣реЛрдВрдЧреЗред

рдорд▓реНрдЯреАрдХрд╛рд╕реНрдЯрдбреЗрд▓реЗрдЧреЗрдЯ рд╡рд░реНрдЧ рдореЗрдВ рд╡рд┐рдзрд┐ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ

 public override sealed int GetHashCode() { if (this.IsUnmanagedFunctionPtr()) return ValueType.GetHashCodeOfPtr(this._methodPtr) ^ ValueType.GetHashCodeOfPtr(this._methodPtrAux); object[] objArray = this._invocationList as object[]; if (objArray == null) return base.GetHashCode(); int num = 0; for (int index = 0; index < (int) this._invocationCount; ++index) num = num * 33 + objArray[index].GetHashCode(); return num; } 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдЕрдкрдиреЗ рддрд░реАрдХреЛрдВ рдХреЛ _invocationList рд╕реВрдЪреА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдпрджрд┐ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛред

рдпрджрд┐ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рдзрд┐ рд╣реИ, рддреЛ рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдореЗрдВ objArray = null рдФрд░, рддрджрдиреБрд╕рд╛рд░, рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХрд╛ рд╣реИрд╢ рдХреЛрдб рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реИрд╢ рдХреЛрдб рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛ред

 object[] objArray = this._invocationList as object[]; if (objArray == null) return base.GetHashCode(); 

рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ

 Func<int> f1 = () => 1; Func<int> f2 = () => 2; 

рдЗрди рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╣реИрд╢ рдХреЛрдб рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдлрдирдХ <int> рдХреЗ рд╣реИрд╢ рдХреЛрдб рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд рд╡реЗ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИрдВред

 Func<int> f1 = () => 1; Func<int> f2 = () => 2; f1 += () => 3; f2 += () => 4; 

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╣реИрд╢ рдХреЛрдб рднреА рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рддрд░реАрдХреЗ рдЕрд▓рдЧ рд╣реИрдВред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╣реИрд╢ рдХреЛрдб рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

 int num = 0; for (int index = 0; index < (int) this._invocationCount; ++index) num = num * 33 + objArray[index].GetHashCode(); return num; 

рдФрд░ рдЖрдЦрд┐рд░реА рдорд╛рдорд▓рд╛

 Func<int> f1 = () => 1; Func<int> f2 = () => 2; f1 += () => 3; f1 += () => 5; f2 += () => 4; 

рд╣реИрд╢ рдХреЛрдб рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдЕрд▓рдЧ рд╣реЛрдВрдЧреЗ рдХрд┐ рдЗрди рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИ (рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдкрд░рд┐рдгрд╛рдореА рд╣реИрд╢ рдХреЛрдб рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреА рд╣реИ)ред

рдЕрдирд╛рдо рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП GetHashCode рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЕрдирд╛рдо рдкреНрд░рдХрд╛рд░ C # 3.0 рдореЗрдВ рдПрдХ рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рднрд╛рд╖рд╛ рдХреА рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ, рддрдерд╛рдХрдерд┐рдд рдХреГрддреНрд░рд┐рдо рд╢рд░реНрдХрд░рд╛, рдХреНрдпреЛрдВрдХрд┐ рд╕реАрдПрд▓рдЖрд░ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИред

рдЙрдирдХреА GetHashCode рд╡рд┐рдзрд┐ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рджреЛ рдЕрдирд╛рдо рдкреНрд░рдХрд╛рд░ рдПрдХ рд╣реА рд╣реИрд╢ рдХреЛрдб рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ рдпрджрд┐ рдФрд░ рдХреЗрд╡рд▓ рдпрджрд┐ рдЙрдирдХреЗ рд╕рднреА рдХреНрд╖реЗрддреНрд░ рд╕рдорд╛рди рд╣реИрдВред рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдореЗрдВ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдирд╛рдо рдкреНрд░рдХрд╛рд░ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдХреВрд▓ рдмрдирд╛рддрд╛ рд╣реИред

 var newType = new { Name = "Timur", Age = 20, IsMale = true }; 

рдРрд╕реЗ рдЕрдирд╛рдо рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрди рдХреЛрдб рдЬрдирд░реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

 public override int GetHashCode() { return -1521134295 * (-1521134295 * (-1521134295 * -974875401 + EqualityComparer<string>.Default.GetHashCode(this.Name)) + EqualityComparer<int >.Default.GetHashCode(this.Age)) + EqualityComparer<bool>.Default.GetHashCode(this.IsMale); } 

рдЯрд┐рдкреНрдкрдгреА

рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ GetHashCode рд╡рд┐рдзрд┐ рдХреЛ рд╕рдорд╛рди рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕реЗ рднреА рдЙрд╕реА рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

 var newType = new { Name = "Timur", Age = 20, IsMale = true }; var newType1 = new { Name = "Timur", Age = 20, IsMale = true }; if (newType.Equals(newType1)) Console.WriteLine("method Equals return true"); else Console.WriteLine("method Equals return false"); if (newType == newType1) Console.WriteLine("operator == return true"); else Console.WriteLine("operator == return false"); 

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдВрд╕реЛрд▓ рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

рд╡рд┐рдзрд┐ рдмрд░рд╛рдмрд░ рд╣реЛрддреА рд╣реИ
рдСрдкрд░реЗрдЯрд░ == рдЭреВрдареЗ рд▓реМрдЯреЗрдВ

рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЕрдирд╛рдо рдкреНрд░рдХрд╛рд░ рд╕рдорддреБрд▓реНрдп рд╡рд┐рдзрд┐ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ ValueType (рдХреЗрд╡рд▓ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдмрд┐рдирд╛) рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдорд╛рдирддрд╛ рдСрдкрд░реЗрдЯрд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕рдорддреБрд▓реНрдп рд╡рд┐рдзрд┐ рдореВрд▓реНрдп рдХреА рддреБрд▓рдирд╛ рдХрд░рддреА рд╣реИ, рдЬрдмрдХрд┐ рд╕рдорд╛рдирддрд╛ рдСрдкрд░реЗрдЯрд░ рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реИред

рдЖрдкрдХреЛ рдЗрдХреНрд╡рд╛рд▓реНрд╕ рдФрд░ рдЧреЗрдЯрд╣реИрд╢рдХреЛрдб рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рдереА?
рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдЕрдирд╛рдо рдкреНрд░рдХрд╛рд░ LINQ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдП рдЧрдП рдереЗ, рдЙрддреНрддрд░ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ред рдмреЗрдирд╛рдореА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдореВрд╣ рдореЗрдВ рд╣реИрд╢ рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ LINQ рдореЗрдВ рд╕рдВрдЪрд╛рд▓рди рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИред

рдЯрд┐рдкреНрдкрдгреА

рдирд┐рд╖реНрдХрд░реНрд╖


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣реИрд╢ рдХреЛрдб рдХреА рдкреАрдврд╝реА рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реИред рдЕрдЪреНрдЫрд╛ рд╣реИрд╢ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдмрд╣реБрдд рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рд╕реАрдПрд▓рдЖрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рд╣рдорд╛рд░реЗ рдЬреАрд╡рди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рд░рд┐рдпрд╛рдпрддреЗрдВ рджреЗрдиреА рдереАрдВред рд╣реИрд╢ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ, рд╕рднреА рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрд╕рдВрднрд╡ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдкрдиреЗ рдХрд╕реНрдЯрдо рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЧреЗрдЯрд╣реИрд╢рдХреЛрдб рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдЖрдкрдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред

рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдорджрджрдЧрд╛рд░ рд░рд╣рд╛ рд╣реИред

рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдХреГрдкрдпрд╛ рдЕрджреНрдпрддрди рдЪрд┐рддреНрд░ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреНрд░реАрдорд╡рд▓реНрдХрд░ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдзрдиреНрдпрд╡рд╛рджред

Source: https://habr.com/ru/post/In188038/


All Articles