Runtime: рд╣реИрд╢ рдХреЛрдб рдХреЗ рд╕рдВрдпреЛрдЬрди рдореЗрдВ рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рд╣реИрд╢рдХреЛрдб рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝рдирд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 25 рдЕрдкреНрд░реИрд▓ 2016  ┬╖  206рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: dotnet/runtime

200+ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд▓рдВрдмреА рдЪрд░реНрдЪрд╛ рдХреЛ рдирдП рдЕрдВрдХ рдХреЗ рд╕рд╛рде

рдпрд╣ рдореБрджреНрджрд╛ рдмрдВрдж рд╣реИ!!!


рдкреНрд░реЗрд░рдгрд╛

рдЬрд╛рд╡рд╛ рдореЗрдВ Objects.hash рдШрдЯрдХ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╣реИрд╢ рдХреЛрдб рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Object.hashCode() рдореЗрдВ рд╡рд╛рдкрд╕ рдЖрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, .NET рдХреЗ рдкрд╛рд╕ рдРрд╕рд╛ рдХреЛрдИ рд╕рдордХрдХреНрд╖ рдирд╣реАрдВ рд╣реИ рдФрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╣реИрд╢ рдХреЛ рдЗрд╕ рддрд░рд╣ рд░реЛрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

public override int GetHashCode()
{
    unchecked
    {
        int result = 17;
        result = result * 23 + field1.GetHashCode();
        result = result * 23 + field2.GetHashCode();
        return result;
    }
}

рдХрднреА-рдХрднреА рд▓реЛрдЧ рдЗрд╕рдХреЗ рд▓рд┐рдП Tuple.Create(field1, field2, ...).GetHashCode() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рднреА рд╕рд╣рд╛рд░рд╛ рд▓реЗрддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рдЦрд░рд╛рдм рд╣реИ (рдЬрд╛рд╣рд┐рд░ рд╣реИ) рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддрд╛ рд╣реИред

рдкреНрд░рд╕реНрддрд╛рд╡

  • рд╡рд░реНрддрдорд╛рди рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рд╕реВрдЪреА (рдкрд┐рдЫрд▓реЗ рд╕реНрд╡реАрдХреГрдд рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдЦрд┐рд▓рд╛рдл https://github.com/dotnet/corefx/issues/8034#issuecomment-262331783):

    • Empty рд╕рдВрдкрддреНрддрд┐ рдЬреЛрдбрд╝реА рдЧрдИ ( ImmutableArray рд╕рдорд╛рди рдкреНрд░рд╛рдХреГрддрд┐рдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ)

    • рддрд░реНрдХ рдирд╛рдо рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЧрдП: hash -> hashCode , obj -> item

namespace System
{
    public struct HashCode : IEquatable<HashCode>
    {
        public HashCode();

        public static HashCode Empty { get; }

        public static HashCode Create(int hashCode);
        public static HashCode Create<T>(T item);
        public static HashCode Create<T>(T item, IEqualityComparer<T> comparer);

        public HashCode Combine(int hashCode);
        public HashCode Combine<T>(T item);
        public HashCode Combine<T>(T item, IEqualityComparer<T> comparer);

        public int Value { get; }

        public static implicit operator int(HashCode hashCode);

        public static bool operator ==(HashCode left, HashCode right);
        public static bool operator !=(HashCode left, HashCode right);

        public bool Equals(HashCode other);
        public override bool Equals(object obj);
        public override int GetHashCode();
        public override string ToString();
    }
}

рдЙрдкрдпреЛрдЧ:

```рд╕реА#
int рд╣реИрд╢рдХреЛрдб 1 = рд╣реИрд╢рдХреЛрдбред рдХреНрд░рд┐рдПрдЯ (рдПрдл 1)ред рдХреЙрдореНрдмрд┐рдиреЗрд╢рди (рдПрдл 2)ред рд╡реИрд▓реНрдпреВ;
int рд╣реИрд╢рдХреЛрдб 2 = рд╣реИрд╢ред рдПрдЧреНрд░реАрдЧреЗрдЯ (рд╣реИрд╢рдХреЛрдбред рдЦрд╛рд▓реА, (рдмреАрдЬ, рд╣реИрд╢) => рдмреАрдЬред рдХреЙрдореНрдмрд┐рди (рд╣реИрд╢));

рд╡рд░ рд╣реИрд╢рдХреЛрдб 3 = рд╣реИрд╢рдХреЛрдбред рдЦрд╛рд▓реА;
foreach (рд╣реИрд╢ рдореЗрдВ int рд╣реИрд╢) {рд╣реИрд╢рдХреЛрдб 3 = рд╣реИрд╢рдХреЛрдб 3ред рдХреЙрдореНрдмрд┐рди (рд╣реИрд╢); }
(рдЗрдВрдЯ) рд╣реИрд╢рдХреЛрдб 3;
```

рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ HashHelpers рдореЗрдВ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

Design Discussion api-needs-work area-System.Numerics

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

[@redknightlois] рдЕрдЧрд░ рд╣рдореЗрдВ System рд▓рд┐рдП рдЬрд╛рдиреЗ рдХрд╛ рдФрдЪрд┐рддреНрдп рдЪрд╛рд╣рд┐рдП рддреЛ рдореИрдВ рдПрдХ рдФрдЪрд┐рддреНрдп рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рд╣рдордиреЗ HashCode рдХреЛ object.GetHashCode() рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рд╣реИ, рдпрд╣ рдЙрдЪрд┐рдд рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рджреЛрдиреЛрдВ рдирд╛рдорд╕реНрдерд╛рди рд╕рд╛рдЭрд╛ рдХрд░реЗрдВрдЧреЗред

рдпрд╣реА рдХрд╛рд░рдг рдерд╛ рдХрд┐ @KrzysztofCwalina рдФрд░ рдореИрдВрдиреЗ рднреА рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ред рдмреЗрдЪрд╛!

рд╕рднреА 206 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдпрджрд┐ рдЖрдк рдХреБрдЫ рдЬрд▓реНрджреА рдФрд░ рдЧрдВрджрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдк ValueTuple.Create(field1, field2).GetHashCode() рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╡рд╣реА рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╣реИ рдЬреЛ Tuple рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬреЛ рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, Objects ) рдФрд░ рдЗрд╕рдореЗрдВ рдЖрд╡рдВрдЯрди рдУрд╡рд░рд╣реЗрдб рдирд╣реАрдВ рд╣реИред

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

@JonHanna рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдкреНрд░рд╢реНрди рднреА рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, string.GetHashCode() ред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ Hash рдХрд░рдирд╛ рдЙрд╕рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рдХрдард┐рди рдХреНрдпреЛрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдЖрд╕рд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рд╢реЗрд╖ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрд╕рд╛рдиреА рд╕реЗ Hash рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди string.GetHashCode() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрдВрдж рдХрд░рдирд╛ рдХрдард┐рди рд╣реИред

+1

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ ASP.NET рдореЗрдВ рдЗрдирдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, https://github.com/aspnet/Common/blob/dev/src/Microsoft.Extensions.HashCodeCombiner.Sources/HashCodeCombiner.csред рдпрд╣ рдЗрдирд▓рд╛рдЗрди рдлреНрд░реЗрдВрдбрд▓реА рднреА рд╣реИред

рдпрджрд┐ рдЖрдк рдХреБрдЫ рдЬрд▓реНрджреА рдФрд░ рдЧрдВрджрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдк ValueTuple.Create(field1, field2).GetHashCode() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЖрд╣, рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░, рдореИрдВрдиреЗ рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЛ рдмрдирд╛рддреЗ рд╕рдордп ValueTuple рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрд╛ рдерд╛ред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рд╕реА # 7/рдЕрдЧрд▓реЗ рдврд╛рдВрдЪреЗ рдХреЗ рд░рд┐рд▓реАрдЬ рд╣реЛрдиреЗ рддрдХ рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛, рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдпрд╣ рднреА рдкрддрд╛ рдЪрд▓реЗрдЧрд╛ рдХрд┐ рдпрд╣ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛрдЧрд╛ (рдЙрди рд╕рдВрдкрддреНрддрд┐/рд╡рд┐рдзрд┐ рдХреЙрд▓ EqualityComparer рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ)ред рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЗрд╕реЗ рдорд╛рдкрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдирд╣реАрдВ рд▓рд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрддрд╛ рдирд╣реАрдВ рдЪрд▓реЗрдЧрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣реИрд╢рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд░реНрдкрд┐рдд/рд╕рд░рд▓ рд╡рд░реНрдЧ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд▓реЛрдЧ рд╣реИрдХрд┐рд╢ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ рдЯреБрдкрд▓реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗрдВред

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

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

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рд╕реА # 7/рдЕрдЧрд▓реЗ рдврд╛рдВрдЪреЗ рдХреЗ рд░рд┐рд▓реАрдЬ рд╣реЛрдиреЗ рддрдХ рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рд╕реА # 2 рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рди рдХрд┐ рдЕрдВрддрд░реНрдирд┐рд░реНрдорд┐рдд рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рдеред

рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдпрд╣ рднреА рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛрдЧрд╛ (рдЙрди рд╕рдВрдкрддреНрддрд┐/рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХреЛ рд╕рдорд╛рдирддрд╛ рдХреЙрдореНрдкреИрдпрд░ рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ)

рдпрд╣ рд╡рд░реНрдЧ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдХреНрдпрд╛ рдХрд░реЗрдЧрд╛? рдпрджрд┐ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ obj == null ? 0 : obj.GetHashCode() рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдХреЛрдИ рддреЗрдЬрд╝ рд╣реИ, рддреЛ рдЙрд╕реЗ ValueTuple рдореЗрдВ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореИрдВ +1 рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдХреБрдЫ рд╣рдлрд╝реНрддреЗ рдкрд╣рд▓реЗ рдЗрдЪреНрдЫреБрдХ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдХрдо рдХреЗ рдЖрд▓реЛрдХ рдореЗрдВ рдЗрдЪреНрдЫреБрдХ рд╣реВрдБ ValueTuple рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЪрд╛рд▓ рдХреЗ рдЖрд╡рдВрдЯрди рднреВрдорд┐ рдХреЗ рдКрдкрд░ рдХрдо рдХрд░рдиреЗ Tuple рдЗрд╕ рдХреЗ рд▓рд┐рдП, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рджреЛ рдорд▓реЛрдВ рдХреЗ рдмреАрдЪ рд╣реИ: рдпрджрд┐ рдЖрдкрдХреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреБрдЫ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рддреЛ рдЖрдк ValueTuple рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдкрдХреЛ рдЙрд╕рд╕реЗ рдЖрдЧреЗ рдХреБрдЫ рдЪрд╛рд╣рд┐рдП, рддреЛ рдЗрд╕ рддрд░рд╣ рдХреА рдХрдХреНрд╖рд╛ рджреВрд░ рдирд╣реАрдВ рдЬрд╛ рд░рд╣реА рд╣реИ рдкрд░реНрдпрд╛рдкреНрддред

рдФрд░ рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ C#7 рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдФрд░ рднреА рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдореЗрдВ рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рд╢реБрдЧрд░ рд╣реЛрдЧреАред

@JonHanna

рдпрд╣ рд╡рд░реНрдЧ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдХреНрдпрд╛ рдХрд░реЗрдЧрд╛? рдЕрдЧрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ obj == null рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реИ? 0 : obj.GetHashCode() рдХрд┐рд╕реА рднреА рддреЗрдЬ рд╣реИ, рдЗрд╕рд╕реЗ ValueTuple рдореЗрдВ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХреНрдпреЛрдВ рди ValueTuple рд╣реИрд╢ рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ Hash рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ? рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрд▓рдУрд╕реА рдХреЛ рднреА рдХрд╛рдлреА рдХрдо рдХрд░ рджреЗрдЧрд╛ (рдЬреЛ рдЕрднреА рд▓рдЧрднрдЧ ~ 2000 рд▓рд╛рдЗрдиреЗрдВ рд╣реИ)ред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:

рдпрджрд┐ рдЖрдкрдХреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рддреЛ рдЖрдк ValueTuple . рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рд╕рдЪ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧреЛрдВ рдХреЛ рдЗрд╕рдХрд╛ рдПрд╣рд╕рд╛рд╕ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╡реЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЕрд╡рд░ рднреЛрд▓реЗ рд╣реИрд╢рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ)ред

рдХрд┐ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреАрдЫреЗ рд░рд╣ рд╕рдХрддрд╛ рд╣реВрдВред

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

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ xxHash32, xxHash64, Metro128 рдХреЛ рдХреЛрдб рдХрд░рдирд╛ рдерд╛ рдФрд░ 128 рд╕реЗ 64 рддрдХ рдФрд░ 64 рд╕реЗ 32 рдмрд┐рдЯреНрд╕ рддрдХ рдЦреБрдж рдХреЛ рдбрд╛рдЙрдирд╕реИрдВрдкрд▓рд┐рдВрдЧ рдХрд░рдирд╛ рдерд╛ред рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реЛрдиреЗ рд╕реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЧреИрд░-рдЕрдиреБрдХреВрд▓рд┐рдд рдФрд░/рдпрд╛ рдЫреЛрдЯреА рдЧрд╛рдбрд╝реА рд▓рд┐рдЦрдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓ рд╕рдХрддреА рд╣реИ (рдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рд╣рдордиреЗ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рднреА рдХреБрдЫ рдмрдЧ рдкрд╛рдП рд╣реИрдВ); рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдЬрд░реВрд░рддреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЪреБрдирдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИред

рд░реБрдЪрд┐ рд╣реЛрдиреЗ рдкрд░ рд╣рдо рдЦреБрд╢реА-рдЦреБрд╢реА рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджрд╛рди рдХрд░реЗрдВрдЧреЗ, рддрд╛рдХрд┐ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЙрдирдХреА рд╕рдореАрдХреНрд╖рд╛ рдХреА рдЬрд╛ рд╕рдХреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдФрд░ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред

@redknightlois рдореБрдЭреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рдпрд╛рд╕ рдореЗрдВ рдЕрдкрдиреЗ рд╕реНрдкреВрдХреАрд╣реИрд╢ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред

@svick рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╕рд╛рд╡рдзрд╛рдиред

@terrajobst , рдПрдкреАрдЖрдИ рдЯреНрд░рд╛рдЗрдПрдЬ/рд╕рдореАрдХреНрд╖рд╛ рдХрддрд╛рд░ рдореЗрдВ рдпрд╣ рдХрд┐рддрдиреА рджреВрд░ рд╣реИ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдПрдкреАрдЖрдИ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рд╣рдореЗрд╢рд╛ рдордВрдЪ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ рдФрд░ рд╕рдВрднрд╡рддрдГ рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рджреНрд░рд╡реНрдпрдорд╛рди рд╣реИ?

рд╕реАрд╕реА: @ ellismg

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдкрдиреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕рдореАрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред

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

@jamesqo long рдЖрдзрд╛рд░рд┐рдд рднреА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

@redknightlois , рдЙрдЪрд┐рдд рд▓рдЧрддрд╛ рд╣реИред рдореИрдВрдиреЗ long рдХреЗ Combine рдУрд╡рд░рд▓реЛрдб рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ред

рдХреНрдпрд╛ @JonHanna рдХрд╛ рд╕реБрдЭрд╛рд╡ рдХрд╛рдлреА рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ?

C# return ValueTuple.Create(a, b, c).GetHashCode();

рдЬрдм рддрдХ рдкрд░реНрдпрд╛рдкреНрдд рдкрд░реНрдпрд╛рдкреНрдд рдХрд╛рд░рдг рди рд╣реЛрдВ, рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ, рд╣рдореЗрдВ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдХрдЯреМрддреА рдХрд░ рд░рд╣рд╛ рд╣реИред

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

рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рд╕рдордЭрд╛рддрд╛ рд╣реВрдБред

рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рд▓реЗрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ ValueTuple рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рд░рд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

        internal static class HashHelpers
        {
            public static int Combine(int h1, int h2)
            {
                // The jit optimizes this to use the ROL instruction on x86
                // Related GitHub pull request: dotnet/coreclr#1830
                uint shift5 = ((uint)h1 << 5) | ((uint)h1 >> 27);
                return ((int)shift5 + h1) ^ h2;
            }
        }

        [MethodImpl(MethodImplOptions.NoInlining)]
        public static int TryStaticCall()
        {
            return HashHelpers.Combine(10202, 2003);
        }

        [MethodImpl(MethodImplOptions.NoInlining)]
        public static int TryValueTuple()
        {
            return ValueTuple.Create(10202, 2003).GetHashCode();
        }
    }

рдЕрдм рдПрдХ рдЕрдиреБрдХреВрд▓рди рд╕рдВрдХрд▓рдХ рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рддрд╣рдд рдХреЛрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╣рд╛рдБ рд╣реИред

рдпрд╣ ValueTuple рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рд╣реИ

image
рддреЛ рдЕрдм рдпрд╣рд╛рдБ рдХреНрдпрд╛ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдкрд╣рд▓реЗ рд╣рдо рд╕реНрдЯреИрдХ рдореЗрдВ рдПрдХ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рдлрд┐рд░ рд╣рдо рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣реИрд╢ рдХреЛрдб рдХрд╣ рд░рд╣реЗ рд╣реИрдВред

рдЕрдм рдЗрд╕рдХреА рддреБрд▓рдирд╛ HashHelper.Combine рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдХрд░реЗрдВ рдЬреЛ рд╕рднреА рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП Hash.Combine рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

image

рдореИрдВ рдЬрд╛рдирддреА рд╣реВрдБ!!!
рд▓реЗрдХрд┐рди рд╡рд╣рд╛рдБ рд░реБрдХрдиреЗ рдирд╣реАрдВ рджреЗрддрд╛... рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:

        [MethodImpl(MethodImplOptions.NoInlining)]
        public static int TryStaticCall(int h1, int h2)
        {
            return HashHelpers.Combine(h1, h2);
        }

        [MethodImpl(MethodImplOptions.NoInlining)]
        public static int TryValueTuple(int h1, int h2)
        {
            return ValueTuple.Create(h1, h2).GetHashCode();
        }

        static unsafe void Main(string[] args)
        {
            var g = new Random();
            int h1 = g.Next();
            int h2 = g.Next(); 
            Console.WriteLine(TryStaticCall(h1, h2));
            Console.WriteLine(TryValueTuple(h1, h2));
        }

image

рдЕрдЪреНрдЫреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдмреЗрд╣рдж рд╕реНрдерд┐рд░ рд╣реИред рд▓реЗрдХрд┐рди рдЖрдЗрдП рдЗрд╕рдХреА рддреБрд▓рдирд╛ рд╡рд┐рдХрд▓реНрдк рд╕реЗ рдХрд░реЗрдВ:

image

рдЕрдм рдУрд╡рд░рдмреЛрд░реНрдб рдЪрд▓рддреЗ рд╣реИрдВ...

        internal static class HashHelpers
        {
            public static int Combine(int h1, int h2)
            {
                // The jit optimizes this to use the ROL instruction on x86
                // Related GitHub pull request: dotnet/coreclr#1830
                uint shift5 = ((uint)h1 << 5) | ((uint)h1 >> 27);
                return ((int)shift5 + h1) ^ h2;
            }
            public static int Combine(int h1, int h2, int h3, int h4)
            {
                return Combine(Combine(h1, h2), Combine(h3, h4));
            }
        }

        [MethodImpl(MethodImplOptions.NoInlining)]
        public static int TryStaticCall(int h1, int h2, int h3, int h4)
        {
            return HashHelpers.Combine(h1, h2, h3, h4);
        }

рдФрд░ рдкрд░рд┐рдгрд╛рдо рдмрд╣реБрдд рд╣реА рдирд┐рджрд░реНрд╢реА рд╣реИ

image

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

image

рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд╛ рдЯреЗрдХрдЕрд╡реЗ рд╕рд░рд▓ рд╣реИ: рд╣реЛрд▓реНрдбрд┐рдВрдЧ рдкреНрд░рдХрд╛рд░ struct рд╣реИ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдореБрдлрд╝реНрдд рд╣реИ :)

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

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

@terrajobst , рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд░реНрд╢рди рдПрдХ рдкреНрд░рдореБрдЦ рдкреНрд░реЗрд░рдгрд╛ рдереА рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдирд╣реАрдВред рдПрдХ рд╕рдорд░реНрдкрд┐рдд рдкреНрд░рдХрд╛рд░ рд╣реЛрдиреЗ рд╕реЗ рдЦреЛрдЬреЗ рдЬрд╛рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓реЗрдЧреА; рд╕реА # 7 рдореЗрдВ рдмрд┐рд▓реНрдЯ-рдЗрди рдЯреБрдкрд▓ рд╕рдкреЛрд░реНрдЯ рдХреЗ рд╕рд╛рде рднреА, рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдпрд╣ рдирд╣реАрдВ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡реЗ рдореВрд▓реНрдп рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИрдВред рдЕрдЧрд░ рд╡реЗ рдРрд╕рд╛ рдХрд░рддреЗ рднреА рд╣реИрдВ, рддреЛ рд╡реЗ рднреВрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЯреБрдкрд▓реНрд╕ GetHashCode рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╕рдВрднрд╡рдд: Google рдХреЗ рдкрд╛рд╕ .NET рдореЗрдВ GetHashCode рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПред

рд╕рд╛рде рд╣реА, ValueTuple.Create.GetHashCode рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реВрдХреНрд╖реНрдо рд╢реБрджреНрдзрддрд╛ рд╕рдорд╕реНрдпрд╛ рд╣реИред рдкрд┐рдЫрд▓реЗ 8 рддрддреНрд╡, рдХреЗрд╡рд▓ рдЕрдВрддрд┐рдо 8 рддрддреНрд╡ рд╣реИрд╢ рдХрд┐рдП рдЧрдП рд╣реИрдВ; рдмрд╛рдХреА рдХреЛ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

@terrajobst RavenDB рдореЗрдВ GetHashCode рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рд╣рдорд╛рд░реЗ рдмреЙрдЯрдорд▓рд╛рдЗрди рдкрд░ рдЗрддрдирд╛ рдкреНрд░рднрд╛рд╡ рдкрдбрд╝рд╛ рдХрд┐ рд╣рдордиреЗ рдЕрддреНрдпрдзрд┐рдХ рдЕрдиреБрдХреВрд▓рд┐рдд рд░реВрдЯреАрди рдХреЗ рдПрдХ рдкреВрд░реЗ рд╕реЗрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рд░реЛрд╕рд▓рд┐рди рдХреА рдЕрдкрдиреА рдЖрдВрддрд░рд┐рдХ рд╣реИрд╢рд┐рдВрдЧ рднреА рд╣реИ https://github.com/dotnet/roslyn/blob/master/src/Compilers/Core/Portable/InternalUtilities/Hash.cs рднреА рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдпрд╣рд╛рдВ рд░реЛрд╕рд▓рд┐рди рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ: https://github .com/dotnet/coreclr/issues/1619 ... рдЗрд╕рд▓рд┐рдП рдЬрдм рдкреНрд░рджрд░реНрд╢рди рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛрддрд╛ рд╣реИ рддреЛ рд╣рдо рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рд░реЛрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рдФрд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рднреБрдЧрддрд╛рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛)ред

рд╕рд╛рде рд╣реА @jamesqo рдореБрджреНрджрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдорд╛рдиреНрдп рд╣реИред рдЗрддрдиреЗ рд╕рд╛рд░реЗ рд╣реИрд╢ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди 1M рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╣реИ рдЬреЛ рдЙрд╕ рдПрдХ рдХреЗ рд╕рд╛рде рдЪрдЯреНрдЯрд╛рди рдкрд░ рдХрджрдо рд░рдЦрдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред

@JonHanna

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

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

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рдкрд░реАрдд рд╕рдЪ рд╣реЛрдЧрд╛, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ; Hash.Combine рдХреЛ рдЖрдо рддреМрд░ рдкрд░ GetHashCode рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬреЛ рд▓реЛрдЧ рд╣реИрд╢рд┐рдВрдЧ рдХрд░рдирд╛ рдЬрд╛рдирддреЗ рд╣реИрдВ, рд╡реЗ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП Hash.Combine рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИред рдиреНрдпреВрдмреАрдЬ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣реИрд╢рд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рд╡реЗ рдШрдЯрдХ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдХреЗрд╡рд▓ xor-ing (рдпрд╛ рдЗрд╕рд╕реЗ рднреА рдмрджрддрд░, рдЬреЛрдбрд╝рдиреЗ) рдХреЗ рдмрдЬрд╛рдп Hash.Combine рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдЙрдЪрд┐рдд рд╣реИрд╢ рдХреИрд╕реЗ рдХрд░реЗрдВред

рд╣рдордиреЗ рдЗрд╕ рдкрд░ рдереЛрдбрд╝реА рдФрд░ рдЪрд░реНрдЪрд╛ рдХреА рдФрд░ рдЖрдкрдиреЗ рд╣рдореЗрдВ рдЖрд╢реНрд╡рд╕реНрдд рдХрд┐рдпрд╛ :-)

рдХреБрдЫ рдФрд░ рдкреНрд░рд╢реНрди:

  1. рд╣рдореЗрдВ рдпрд╣ рддрдп рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рдХрд╣рд╛рдВ рд░рдЦрд╛ рдЬрд╛рдПред рдПрдХ рдирдпрд╛ рдирд╛рдорд╕реНрдерд╛рди рдкреЗрд╢ рдХрд░рдирд╛ рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИ; рд╣рд╛рд▓рд╛рдВрдХрд┐ System.Numerics рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред System.Collections.Generic рднреА рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рддреБрд▓рдирд╛рдХрд░реНрддрд╛ рд╣реИрдВ рдФрд░ рд╣реИрд╢рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдХреНрд╕рд░ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  2. рдХреНрдпрд╛ рд╣рдореЗрдВ рдЕрдЬреНрдЮрд╛рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╣реИрд╢ рдХреЛрдб рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрди-рдореБрдХреНрдд рдмрд┐рд▓реНрдбрд░ рдкреИрдЯрд░реНрди рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдкрд░ (2) @Eilon рдпрд╣ рдХрд╣рдирд╛ рдерд╛:

рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП, ASP.NET Core (рдФрд░ рдЗрд╕рдХреЗ рдкреВрд░реНрд╡рд╡рд░реНрддреА рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░реЛрдЬреЗрдХреНрдЯ) рдПрдХ HashCodeCombiner рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ: https://github.com/aspnet/Common/blob/dev/src/Microsoft.Extensions.HashCodeCombiner.Sources/HashCodeCombiner.cs

( @ рдбреЗрд╡рд┐рдб рдлрд╛рдЙрд▓рд░ рдиреЗ рдХрдИ рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ рдЧрд┐рдЯрд╣рдм рдереНрд░реЗрдб рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдерд╛ред)

рдФрд░ рдпрд╣ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЙрдкрдпреЛрдЧ рд╣реИ: https://github.com/aspnet/Mvc/blob/760c8f38678118734399c58c2dac981ea6e47046/src/Microsoft.AspNetCore.Mvc.Razor/Internal/ViewLocationCacheKey.cs#L129 -L144

``` рд╕реА#
рд╡рд░ рд╣реИрд╢рдХреЛрдб рдХреЙрдореНрдмрд┐рдирд░ = рд╣реИрд╢рдХреЛрдб рдХреЙрдореНрдмрд┐рдирд░ред рд╕реНрдЯрд╛рд░реНрдЯ ();
рд╣реИрд╢рдХреЛрдб рдХреЙрдореНрдмрд┐рдирд░ред рдЬреЛрдбрд╝реЗрдВ (IsMainPage? 1: 0);
рд╣реИрд╢рдХреЛрдб рдХреЙрдореНрдмрд┐рдирд░ред рдЬреЛрдбрд╝реЗрдВ (рд╡реНрдпреВрдирд╛рдо, рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЙрдордкреЗрдпрд░ред рдСрд░реНрдбрд┐рдирд▓);
рд╣реИрд╢рдХреЛрдб рдХреЙрдореНрдмрд┐рдирд░ред рдЬреЛрдбрд╝реЗрдВ (рдирд┐рдпрдВрддреНрд░рдХ рдирд╛рдо, рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЙрдореНрдкреИрд░рд░ред рдСрд░реНрдбрд┐рдирд▓);
рд╣реИрд╢рдХреЛрдб рдХреЙрдореНрдмрд┐рдирд░ред рдЬреЛрдбрд╝реЗрдВ (рдХреНрд╖реЗрддреНрд░рдирд╛рдо, рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЙрдореНрдкреЗрдпрд░рд░ред рдСрд░реНрдбрд┐рдирд▓);

рдЕрдЧрд░ (ViewLocationExpanderValues!= null)
{
foreach (ViewLocationExpanderValues тАЛтАЛтАЛтАЛрдореЗрдВ var рдЖрдЗрдЯрдо)
{
рд╣реИрд╢рдХреЛрдб рдХреЙрдореНрдмрд┐рдирд░ред рдЬреЛрдбрд╝реЗрдВ (рдЖрдЗрдЯрдоред рдХреБрдВрдЬреА, рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЙрдореНрдкреЗрдпрд░рд░ред рдСрд░реНрдбрд┐рдирд▓);
рд╣реИрд╢рдХреЛрдб рдХреЙрдореНрдмрд┐рдирд░ред рдЬреЛрдбрд╝реЗрдВ (рдЖрдЗрдЯрдоред рд╡реИрд▓реНрдпреВ, рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЙрдореНрдкреИрд░рд░ред рдСрд░реНрдбрд┐рдирд▓);
}
}

рд╡рд╛рдкрд╕реА рд╣реИрд╢рдХреЛрдб рдХреЙрдореНрдмрд┐рдирд░;
```

рд╣рдордиреЗ рдЗрд╕ рдкрд░ рдереЛрдбрд╝реА рдФрд░ рдЪрд░реНрдЪрд╛ рдХреА рдФрд░ рдЖрдкрдиреЗ рд╣рдореЗрдВ рдЖрд╢реНрд╡рд╕реНрдд рдХрд┐рдпрд╛ :-)

рдореИрдВ

рдПрдХ рдирдпрд╛ рдирд╛рдорд╕реНрдерд╛рди рдкреЗрд╢ рдХрд░рдирд╛ рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИ; System.Numerics рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдпрджрд┐ рд╣рдо рдПрдХ рдирдпрд╛ рдирд╛рдо рд╕реНрдерд╛рди рдирд╣реАрдВ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреЛрдИ рднреА рдХреЛрдб рдЬрд┐рд╕рдореЗрдВ Hash рдирд╛рдордХ рдПрдХ рд╡рд░реНрдЧ рд╣реИ рдФрд░ рдПрдХ using System.Numerics рдирд┐рд░реНрджреЗрд╢ рдЕрд╕реНрдкрд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣реЗрдЧрд╛ред

рдХреНрдпрд╛ рд╣рдореЗрдВ рдЕрдЬреНрдЮрд╛рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╣реИрд╢ рдХреЛрдб рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрди-рдореБрдХреНрдд рдмрд┐рд▓реНрдбрд░ рдкреИрдЯрд░реНрди рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдпрд╣ рдПрдХ рдорд╣рд╛рди рд╡рд┐рдЪрд╛рд░ рдХреА рддрд░рд╣ рд▓рдЧ рд░рд╣рд╛ рд╣реИред рдХреБрдЫ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ, рд╢рд╛рдпрдж рд╣рдореЗрдВ рдЗрд╕реЗ HashBuilder (рдПрдХ рд▓рд╛ StringBuilder ) рдирд╛рдо рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрд╕реЗ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ Add рд╡рд┐рдзрд┐ рдХреЗ рдмрд╛рдж рдЗрд╕реЗ return this рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рд╣реИрд╢ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬреИрд╕реЗ:

public override int GetHashCode()
{
    return HashBuilder.Create(_field1)
        .Add(_field2)
        .Add(_field3)
        .ToHash();
}

@jamesqo рдХреГрдкрдпрд╛ рдереНрд░реЗрдб рдкрд░ рд╕рд╣рдорддрд┐ рд╣реЛрдиреЗ рдкрд░ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рд╢реАрд░реНрд╖ рдкрд░ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВред рдЗрд╕рдХреЗ рдмрд╛рдж рд╣рдо рдЕрдВрддрд┐рдо рд╕рдореАрдХреНрд╖рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЬреИрд╕реЗ рд╣реА рдЖрдк рдбрд┐рдЬрд╝рд╛рдЗрди рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ рдЕрднреА рдХреЗ рд▓рд┐рдП рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛ ;-)

рдпрджрд┐ рд╣рдо рдПрдХ рдирдпрд╛ рдирд╛рдо рд╕реНрдерд╛рди рдирд╣реАрдВ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреЛрдИ рднреА рдХреЛрдб рдЬрд┐рд╕рдореЗрдВ Hash рдирд╛рдордХ рдПрдХ рд╡рд░реНрдЧ рд╣реИ рдФрд░ рдПрдХ using System.Numerics рдирд┐рд░реНрджреЗрд╢ рдЕрд╕реНрдкрд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣реЗрдЧрд╛ред

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рджреГрд╢реНрдп рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕рдВрдХрд▓рдХ рдЖрдкрдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд╕рдВрдж рдХрд░реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рдВрдХрд▓рди рдЗрдХрд╛рдИ рдХреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╛рдорд╕реНрдерд╛рди рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЛ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА: рдПрдкреАрдЖрдИ рдЬреЛрдбрд╝рдирд╛ рдПрдХ рд╕реНрд░реЛрдд рддреЛрдбрд╝рдиреЗ рд╡рд╛рд▓рд╛ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рд╕реЗ рдмрдЪрдирд╛ рдЕрд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╣реИ, рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рд╣рдо рдЖрдЧреЗ рдХреА рдкреНрд░рдЧрддрд┐ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╣рдо рдЖрдо рддреМрд░ рдкрд░ рд╕рдВрдШрд░реНрд╖реЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдРрд╕реЗ рдирд╛рдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬреЛ рдмрд╣реБрдд рд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдореЗрдВ Hash рдЯрд╛рдЗрдк рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ HashCode рд╢рд╛рдпрдж рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред

рдХреБрдЫ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ, рд╢рд╛рдпрдж рд╣рдореЗрдВ рдЗрд╕реЗ рд╣реИрд╢рдмрд┐рд▓реНрдбрд░ рдирд╛рдо рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП

рдкрд╣рд▓реЗ рд╕рдиреНрдирд┐рдХрдЯрди рдХреЗ рд░реВрдк рдореЗрдВ рдореИрдВ рд╕реНрдЯреИрдЯрд┐рдХреНрд╕ рдФрд░ рдмрд┐рд▓реНрдбрд░ рдХреЛ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдореЗрдВ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛, рдЬреИрд╕реЗ:

``` рд╕реА#
рдиреЗрдорд╕реНрдкреЗрд╕ рд╕рд┐рд╕реНрдЯрдо
{
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕рдВрд░рдЪрдирд╛ рд╣реИрд╢рдХреЛрдб
{
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдереИрддрд┐рдХ рдЗрдВрдЯ рдХреЙрдореНрдмрд┐рдиреЗрд╢рди (рдЗрдВрдЯ рд╣реИрд╢ 1, рдЗрдВрдЯ рд╣реИрд╢ 2);
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдереИрддрд┐рдХ рдЗрдВрдЯ рдХреЙрдореНрдмрд┐рдиреЗрд╢рди (рдЗрдВрдЯ рд╣реИрд╢ 1, рдЗрдВрдЯ рд╣реИрд╢ 2, рдЗрдВрдЯ рд╣реИрд╢ 3);
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдереИрддрд┐рдХ рдЗрдВрдЯ рдХреЙрдореНрдмрд┐рдиреЗрд╢рди (рдЗрдВрдЯ рд╣реИрд╢ 1, рдЗрдВрдЯ рд╣реИрд╢ 2, рдЗрдВрдЯ рд╣реИрд╢ 3, рдЗрдВрдЯ рд╣реИрд╢ 4);
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдереИрддрд┐рдХ рдЗрдВрдЯ рдХреЙрдореНрдмрд┐рдиреЗрд╢рди (рдЗрдВрдЯ рд╣реИрд╢ 1, рдЗрдВрдЯ рд╣реИрд╢ 2, рдЗрдВрдЯ рд╣реИрд╢ 3, рдЗрдВрдЯ рд╣реИрд╢ 4, рдЗрдВрдЯ рд╣реИрд╢ 5);
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдереИрддрд┐рдХ рдЗрдВрдЯ рдХреЙрдореНрдмрд┐рдиреЗрд╢рди (рдЗрдВрдЯ рд╣реИрд╢ 1, рдЗрдВрдЯ рд╣реИрд╢ 2, рдЗрдВрдЯ рд╣реИрд╢ 3, рдЗрдВрдЯ рд╣реИрд╢ 4, рдЗрдВрдЯ рд╣реИрд╢ 5, рдЗрдВрдЯ рд╣реИрд╢ 6);

    public static long Combine(long hash1, long hash2);
    public static long Combine(long hash1, long hash2, long hash3);
    public static long Combine(long hash1, long hash2, long hash3, long hash4);
    public static long Combine(long hash1, long hash2, long hash3, long hash4, long hash5);
    public static long Combine(long hash1, long hash2, long hash3, long hash4, long hash5, longhash6);

    public static int CombineHashCodes<T1, T2>(T1 o1, T2 o2);
    public static int CombineHashCodes<T1, T2, T3>(T1 o1, T2 o2, T3 o3);
    public static int CombineHashCodes<T1, T2, T3, T4>(T1 o1, T2 o2, T3 o3, T4 o4);
    public static int CombineHashCodes<T1, T2, T3, T4, T5>(T1 o1, T2 o2, T3 o3, T4 o4, T5 o5);
    public static int CombineHashCodes<T1, T2, T3, T4, T5, T6>(T1 o1, T2 o2, T3 o3, T4 o4, T5 o5, T6 o6);

    public void Combine(int hashCode);
    public void Combine(long hashCode);
    public void Combine<T>(T obj);
    public void Combine(string text, StringComparison comparison);

    public int Value { get; }
}

}

This allows for code like this:

``` C#
return HashCode.Combine(value1, value2);

рд╕рд╛рде рд╣реА рд╕рд╛рде:

``` рд╕реА#
рд╡рд░ рд╣реИрд╢рдХреЛрдб = рдирдпрд╛ рд╣реИрд╢рдХреЛрдб ();
рд╣реИрд╢рдХреЛрдбред рдХреЙрдореНрдмрд╛рдЗрди (IsMainPage? 1: 0);
рд╣реИрд╢рдХреЛрдбред рдХреЙрдореНрдмрд╛рдЗрди (рд╡реНрдпреВрдирд╛рдо, рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЙрдореНрдкреИрд░рд░ред рдСрд░реНрдбрд┐рдирд▓);
рд╣реИрд╢рдХреЛрдбред рдХреЙрдореНрдмрд┐рди (рдирд┐рдпрдВрддреНрд░рдХ рдирд╛рдо, рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЙрдореНрдкреЗрдпрд░ред рдСрд░реНрдбрд┐рдирд▓);
рд╣реИрд╢рдХреЛрдбред рдХреЙрдореНрдмрд┐рди (рдХреНрд╖реЗрддреНрд░рдирд╛рдо, рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЙрдореНрдкреИрдпрд░ред рдСрд░реНрдбрд┐рдирд▓);

рдЕрдЧрд░ (ViewLocationExpanderValues!= null)
{
foreach (ViewLocationExpanderValues тАЛтАЛтАЛтАЛрдореЗрдВ var рдЖрдЗрдЯрдо)
{
рд╣реИрд╢рдХреЛрдбред рдХреЙрдореНрдмрд┐рдиреЗрд╢рди (рдЖрдЗрдЯрдоред рдХреА, рд╕реНрдЯреНрд░рд┐рдВрдЧрдХреЙрдордкреЗрдпрд░ред рдСрд░реНрдбрд┐рдирд▓);
рд╣реИрд╢рдХреЛрдбред рдХреЙрдореНрдмрд╛рдЗрди (рдЖрдЗрдЯрдоред рд╡реИрд▓реНрдпреВ, рд╕реНрдЯреНрд░рд┐рдВрдЧрдХреЙрдордкреЗрдпрд░ред рдСрд░реНрдбрд┐рдирд▓);
}
}

рд╡рд╛рдкрд╕реА рд╣реИрд╢рдХреЛрдбред рдореВрд▓реНрдп;
```

рд╡рд┐рдЪрд╛рд░?

рдореБрдЭреЗ рдЬрдВрдЬреАрд░ рдХреЙрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ @jamesqo рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рддрд░реАрдХреЛрдВ рд╕реЗ this рд▓реМрдЯрд╛рдПрдВ Combine )ред

рдореИрдВ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рд╕реНрдерд┐рд░ рддрд░реАрдХреЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рдЯрд╛рдиреЗ рдФрд░ рдХреЗрд╡рд▓ рдЙрджрд╛рд╣рд░рдг рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдЬрд╛рдКрдВрдЧрд╛ ...

Combine(long hashCode) рдмрд╕ int рдиреАрдЪреЗ рдЖ рдЬрд╛рдПрдЧрд╛ред рдХреНрдпрд╛ рд╣рдо рд╡рд╛рдХрдИ рдРрд╕рд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?
рдкрд╣рд▓реА рдЬрдЧрд╣ рдореЗрдВ long рдУрд╡рд░рд▓реЛрдб рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреЗрд╕ рдХреНрдпрд╛ рд╣реИ?

@karelz рдХреГрдкрдпрд╛ рдЙрдиреНрд╣реЗрдВ рди рд╣рдЯрд╛рдПрдВ,

рдирд╛рдо рд╕рдВрдШрд░реНрд╖ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдордиреЗ Hashing рд╕реНрдерд┐рд░ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдФрд░ рдХреЛрдб рдЕрдЪреНрдЫрд╛ рджрд┐рдЦрддрд╛ рд╣реИред

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

@redknightlois рдЬрд┐рдЬреНрдЮрд╛рд╕реБ, рдпрджрд┐ рд╕рдВрд░рдЪрдирд╛ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ HashCode ) рдПрдХ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдлрд┐рдЯ рд╣реЛ рд╕рдХрддреА рд╣реИ, рддреЛ рдХреНрдпрд╛ JIT рдХреЛрдИ рднреА рдмрджрддрд░ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ? рдпрд╣ рдХреЗрд╡рд▓ int рдмрдбрд╝рд╛ рд╣реЛрдЧрд╛ред

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

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ @karelz рдиреЗ рдкрд╣рд▓реЗ рд╣реА рдореЗрд░реА рдмрд╛рддреЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдпрд╣рд╛рдВ рдХрд░ рджрд┐рдпрд╛ рд╣реИред

@karelz , рдореИрдВ int -рд╕рд╛рдЗрдЬреНрдб рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рд╕рднреНрдп рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ (рдЬреЛ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдХрд░рддрд╛ рд╣реИ, ImmutableArray рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдУрд╡рд░рд╣реЗрдб рдирд╣реАрдВ рд╣реИ) рддреЛ рд╕реНрдерд┐рд░ рдЕрдзрд┐рднрд╛рд░ рд╣реИрдВ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдФрд░ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

@terrajobst рдореЗрд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдФрд░ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ:

  • рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЖрдкрдХреЗ рдФрд░ рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдереЛрдбрд╝рд╛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред HashCode рдПрдХ рдЕрдЪреНрдЫрд╛ рдирд╛рдо рд▓рдЧрддрд╛ рд╣реИ; рдпрд╣ рдмрд┐рд▓реНрдбрд░ рдкреИрдЯрд░реНрди рдХреЗ рдмрд╛рдж рдПрдХ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рд╕рдВрд░рдЪрдирд╛ рд╣реЛрдирд╛ рдЬрд░реВрд░реА рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдпрд╣ int рдЖрд╕рдкрд╛рд╕ рдПрдХ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдЖрд╡рд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ Combine рдСрдкрд░реЗрд╢рди рдПрдХ рдирдпрд╛ HashCode рдорд╛рди рд▓реМрдЯрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП
public struct HashCode
{
    private readonly int _hash;

    public HashCode Combine(int hash) => return new HashCode(CombineCore(_hash, hash));

    public HashCode Combine<T>(T item) => Combine(EqualityComparer<T>.Default.GetHashCode(item));
}

// Usage
HashCode combined = new HashCode(_field1)
    .Combine(_field2)
    .Combine(_field3);
  • рд╣рдорд╛рд░реЗ рдкрд╛рд╕ int рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рд▓рд┐рдП рдмрд╕ рдПрдХ рдирд┐рд╣рд┐рдд рдСрдкрд░реЗрдЯрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рд▓реЛрдЧреЛрдВ рдХреЛ рдЙрд╕ рдЕрдВрддрд┐рдо .Value рдХреЙрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛред
  • рд░реЗ Combine , рдХреНрдпрд╛ рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдирд╛рдо рд╣реИ? рдпрд╣ рдЕрдзрд┐рдХ рд╡рд░реНрдгрдирд╛рддреНрдордХ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди Add рдЫреЛрдЯрд╛ рдФрд░ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИред ( Mix рдПрдХ рдФрд░ рд╡рд┐рдХрд▓реНрдк рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рджрд░реНрджрдирд╛рдХ рд╣реИред)

    • public void Combine(string text, StringComparison comparison) : рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рд╕реЗ рдЕрд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЙрди рджреБрд░реНрд▓рдн рд╕рдордпреЛрдВ рдХреЗ рд▓рд┐рдП StringComparer.XXX.GetHashCode(str) рд▓рд┐рдЦрдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

    • рд╣рдореЗрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕реЗ рд▓рдВрдмреЗ рдУрд╡рд░рд▓реЛрдб рдХреЛ рд╣рдЯрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд▓рдВрдмреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ HashCode рдкреНрд░рдХрд╛рд░ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред Int64HashCode , рдпрд╛ LongHashCode рдЬреИрд╕рд╛ рдХреБрдЫред

рдореИрдВрдиреЗ TryRoslyn рдкрд░ рдЪреАрдЬреЛрдВ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдирдореВрдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд┐рдпрд╛: http://tinyurl.com/zej9yux

рд╕реМрднрд╛рдЧреНрдп рд╕реЗ рдЗрд╕реЗ рдЬрд╛рдВрдЪрдирд╛ рдЖрд╕рд╛рди рд╣реИред рдФрд░ рдЕрдЪреНрдЫреА рдЦрдмрд░ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдареАрдХ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ . рд╣реИ

image

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ int рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рд▓рд┐рдП рдмрд╕ рдПрдХ рдирд┐рд╣рд┐рдд рдСрдкрд░реЗрдЯрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рд▓реЛрдЧреЛрдВ рдХреЗ рдкрд╛рд╕ рд╡рд╣ рдЕрдВрддрд┐рдо .Value рдХреЙрд▓ рди рд╣реЛред

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

        [MethodImpl(MethodImplOptions.NoInlining)]
        public static int TryHashCombiner(int h1, int h2, int h3, int h4)
        {
            var h = new HashCode(h1).Combine(h2).Combine(h3).Combine(h4);
            return h.Value;
        }

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

рдХрдореНрдмрд╛рдЗрди рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдирд╛рдо рд╣реИ рдЬреЛ рд╣реИрд╢рд┐рдВрдЧ рд╕рдореБрджрд╛рдп afaik рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдпрд╣ рдЖрдкрдХреЛ рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╡рд┐рдЪрд╛рд░ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред

@jamesqo рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╣реИрд╢рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВ, рд╣рдореЗрдВ рд░реЗрд╡реЗрдирдбреАрдмреА рдХреЗ рд▓рд┐рдП 32 рдмрд┐рдЯ, 64 рдмрд┐рдЯ рд╕реЗ 128 рдмрд┐рдЯ рддрдХ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рддреЗрдЬрд╝ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдерд╛ (рдФрд░ рд╣рдо рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╣рд░ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ)ред

рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреБрдЫ рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рддрдВрддреНрд░ рдХреЗ рд╕рд╛рде рдЗрд╕ рдбрд┐рдЬрд╛рдЗрди рдореЗрдВ рдЖрдЧреЗ рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ:

        internal interface IHashCode<T> where T : struct
        {
            T Combine(T h1, T h2);
        }

        internal struct RotateHashCode : IHashCode<int>, IHashCode<long>
        {
            long IHashCode<long>.Combine(long h1, long h2)
            {
                // The jit optimizes this to use the ROL instruction on x86
                // Related GitHub pull request: dotnet/coreclr#1830
                ulong shift5 = ((ulong)h1 << 5) | ((ulong)h1 >> 27);
                return ((int)shift5 + h1) ^ h2;
            }

            int IHashCode<int>.Combine(int h1, int h2)
            {
                // The jit optimizes this to use the ROL instruction on x86
                // Related GitHub pull request: dotnet/coreclr#1830
                uint shift5 = ((uint)h1 << 5) | ((uint)h1 >> 27);
                return ((int)shift5 + h1) ^ h2;
            }
        }

        internal struct HashCodeCombiner<T, W> where T : struct, IHashCode<W>
                                               where W : struct
        {
            private static T hasher;
            public W Value;

            static HashCodeCombiner()
            {
                hasher = new T();
            }

            [MethodImpl(MethodImplOptions.AggressiveInlining)]
            public HashCodeCombiner(W seed)
            {
                this.Value = seed;
            }

            [MethodImpl(MethodImplOptions.AggressiveInlining)]
            public HashCodeCombiner<T,W> Combine( W h1 )
            {
                Value = hasher.Combine(this.Value, h1);
                return this;
            }
        }

        [MethodImpl(MethodImplOptions.NoInlining)]
        public static int TryHashCombinerT(int h1, int h2, int h3, int h4)
        {
            var h = new HashCodeCombiner<RotateHashCode, int>(h1).Combine(h2).Combine(h3).Combine(h4);
            return h.Value;
        }

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЬреЗрдЖрдИрдЯреА рдЗрд╕рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХрд╖реНрдЯрдкреНрд░рдж рдкреНрд░реЛрд▓реЙрдЧ рдХреЛрдб рдХреНрдпреЛрдВ рдмрдирд╛ рд░рд╣рд╛ рд╣реИред рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╢рд╛рдпрдж рдЗрд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЬреЗрдЖрдИрдЯреА рджреЗрд╡реЛрдВ рд╕реЗ рдкреВрдЫрдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдмрд╛рдХреА рдХреЗ рд▓рд┐рдП рдЖрдк рдПрдХ рднреА рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдмрд░реНрдмрд╛рдж рдХрд┐рдП рдмрд┐рдирд╛ рдЬрд┐рддрдиреЗ рдЪрд╛рд╣реЗрдВ рдЙрддрдиреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреЙрдореНрдмрд┐рдирд░ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд╣рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рд╡рд┐рдзрд┐ рд╕рдВрднрд╡рддрдГ рд╕рдВрдпреЛрдЬрдХреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣реИрд╢ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рд╣реИред cc @CarolEidt @AndyAyersMS

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдПрдХ рд╣реА рд╣реИрд╢рд┐рдВрдЧ рдЕрд╡рдзрд╛рд░рдгрд╛ рдЫрддрд░реА рдХреЗ рдиреАрдЪреЗ рдХреНрд░рд┐рдкреНрдЯреЛ рдФрд░ рдЧреИрд░-рдХреНрд░рд┐рдкреНрдЯреЛ рд╣реИрд╢ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рддрдВрддреНрд░ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдЬрд╝реЛрд░ рд╕реЗ рд╕реЛрдЪрдирд╛ред

@jamesqo

рдпрд╣ рдмрд┐рд▓реНрдбрд░ рдкреИрдЯрд░реНрди рдХреЗ рдмрд╛рдж рдПрдХ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рд╕рдВрд░рдЪрдирд╛ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ

рдЖрд╣ рд╣рд╛рдБред рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдореИрдВ рдЙрд╕ рдкреИрдЯрд░реНрди рдХреЗ рд╕рд╛рде рдареАрдХ рд╣реВрдБред рдпрджрд┐ рдСрдкрд░реЗрд╢рди рдХрд╛ рдХреЛрдИ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рд╣реЛрддрд╛ рд╣реИ рддреЛ рдореБрдЭреЗ рдЖрдорддреМрд░ рдкрд░ рд░рд┐рдЯрд░реНрдирд┐рдВрдЧ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХрд╛ рдкреИрдЯрд░реНрди рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдмреБрд░рд╛ рд╣реИ рдЕрдЧрд░ рдПрдкреАрдЖрдИ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп WithXxx рдкреИрдЯрд░реНрди рдХрд╛ рдкрд╛рд▓рди рдХрд░ рд░рд╣рд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкреИрдЯрд░реНрди рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рд╣реИ рддрд╛рдХрд┐ рдкреИрдЯрд░реНрди рдареАрдХ рдХрд╛рдо рдХрд░реЗред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЖрдкрдХреЗ рдФрд░ рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдереЛрдбрд╝рд╛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

, рддреЛ рдХрд┐рд╕ рдмрд╛рд░реЗ рдореЗрдВ:

``` рд╕реА#
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕рдВрд░рдЪрдирд╛ рд╣реИрд╢рдХреЛрдб
{
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдереИрддрд┐рдХ рд╣реИрд╢рдХреЛрдб рдмрдирд╛рдПрдБ(рдЯреА рдУрдмреАрдЬреЗ);

[Pure] public HashCode Combine(int hashCode);
[Pure] public HashCode Combine(long hashCode);
[Pure] public HashCode Combine<T>(T obj);
[Pure] public HashCode Combine(string text, StringComparison comparison);

public int Value { get; }

public static implicit operator int(HashCode hashCode);

}

This allows for code like this:

``` C#
public override int GetHashCode()
{
    return HashCode.Create(value1).Combine(value2);
}

рд╕рд╛рде рдореЗрдВ рдпрд╣ рднреА:

``` рд╕реА#
рд╡рд░ рд╣реИрд╢рдХреЛрдб = рдирдпрд╛ рд╣реИрд╢рдХреЛрдб ()
.Combine(IsMainPage ? 1:0)
.Combine(ViewName, StringComparer.Ordinal)
.Combine(ControllerName, StringComparer.Ordinal)
.Combine(AreaName, StringComparer.Ordinal);

рдЕрдЧрд░ (ViewLocationExpanderValues!= null)
{
foreach (ViewLocationExpanderValues тАЛтАЛтАЛтАЛрдореЗрдВ var рдЖрдЗрдЯрдо)
{
рд╣реИрд╢рдХреЛрдб = рд╣реИрд╢рдХреЛрдбред рдХреЙрдореНрдмрд┐рдиреЗрд╢рди (рдЖрдЗрдЯрдоред рдХреА, рд╕реНрдЯреНрд░рд┐рдВрдЧрдХреЙрдордкреЗрдпрд░ред рдСрд░реНрдбрд┐рдирд▓);
рд╣реИрд╢рдХреЛрдб = рд╣реИрд╢рдХреЛрдбред рдХреЙрдореНрдмрд┐рди (рдЖрдЗрдЯрдоред рд╡реИрд▓реНрдпреВ, рд╕реНрдЯреНрд░рд┐рдВрдЧрдХреЙрдордкреЗрдпрд░ред рдСрд░реНрдбрд┐рдирд▓);
}
}

рд╡рд╛рдкрд╕реА рд╣реИрд╢рдХреЛрдбред рдореВрд▓реНрдп;
```

@terrajobst рд╡рд┐рдЪрд╛рд░:

  1. Create<T> рдлрд╝реИрдХреНрдЯрд░реА рдкрджреНрдзрддрд┐ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдиреНрдпрдерд╛, рдПрдХ рд╣реА рдЪреАрдЬрд╝ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ 2 рддрд░реАрдХреЗ рд╣реЛрдВрдЧреЗ, HashCode.Create(_val) рдпрд╛ new HashCode().Combine(_val) ред рд╕рд╛рде рд╣реА, Create / Combine рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдирд╛рдо рд╣реЛрдиреЗ рд╕реЗ рдЕрдВрддрд░-рдЕрдиреБрдХреВрд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рдЖрдк рдПрдХ рдирдпрд╛ рдкрд╣рд▓рд╛ рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ 2 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред
  2. рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ/рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЙрдореНрдкреИрд░рд┐рд╕рди рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдЕрдзрд┐рднрд╛рд░ рдпрд╣рд╛рдВ рд╣реИ; HashCode рдХрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╢рд╛рдпрдж рд╣рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ GetHashCode(StringComparison) рдПрдкреАрдЖрдИ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП? (рд╕рд╛рде рд╣реА рд╡реЗ рд╕рднреА рдХреНрд░рдорд┐рдХ рддреБрд▓рдирд╛рдПрдВ рд╣реИрдВ, рдЬреЛ string.GetHashCode рдХрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИред)
  3. Value рд╣реЛрдиреЗ рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ, рдЕрдЧрд░ int рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдирд┐рд╣рд┐рдд рдСрдкрд░реЗрдЯрд░ рд╣реИ? рдлрд┐рд░, рдпрд╣ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓реЛрдЧреЛрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЪреАрдЬреЗрдВ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд░реЗрдЧрд╛ред
  4. рд╣рдореЗрдВ long рдЕрдзрд┐рднрд╛рд░ рдХреЛ рдПрдХ рдирдП рдкреНрд░рдХрд╛рд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред HashCode рдХреЗрд╡рд▓ 32 рдмрд┐рдЯ рдЪреМрдбрд╝рд╛ рд╣реЛрдЧрд╛; рдпрд╣ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ред
  5. рдЖрдЗрдП рдХреБрдЫ рдЕрдзрд┐рднрд╛рд░ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдкреНрд░рдХрд╛рд░ рд▓реЗрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╣реИрд╢рд┐рдВрдЧ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╣реИрдВред

рдпрд╣рд╛рдБ рдореЗрд░реА рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдПрдкреАрдЖрдИ рд╣реИ:

public struct HashCode
{
    public HashCode Combine(int hash);
    public HashCode Combine(uint hash);
    public HashCode Combine<T>(T obj);

    public static implicit operator int(HashCode hashCode);
    public static implicit operator uint(HashCode hashCode);
}

public struct Int64HashCode
{
    public Int64HashCode Combine(long hash);
    public Int64HashCode Combine(ulong hash);

    public static implicit operator long(Int64HashCode hashCode);
    public static implicit operator ulong(Int64HashCode hashCode);
}

рдХреЗрд╡рд▓ рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде, ASP.NET рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдЕрднреА рднреА рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

var hashCode = new HashCode()
    .Combine(IsMainPage ? 1 : 0)
    .Combine(ViewName)
    .Combine(ControllerName)
    .Combine(AreaName);

if (ViewLocationExpanderValues != null)
{
    foreach (var item in ViewLocationExpanderValues)
    {
        hashCode = hashCode.Combine(item.Key);
        hashCode = hashCode.Combine(item.Value);
    }
}

return hashCode;

@jamesqo

Value рд╣реЛрдиреЗ рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ, рдЕрдЧрд░ int рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдирд┐рд╣рд┐рдд рдСрдкрд░реЗрдЯрд░ рд╣реИ? рдлрд┐рд░, рдпрд╣ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓реЛрдЧреЛрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЪреАрдЬреЗрдВ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд░реЗрдЧрд╛ред

рдСрдкрд░реЗрдЯрд░ рдУрд╡рд░рд▓реЛрдб рдХреЗ рд▓рд┐рдП рдлреНрд░реЗрдорд╡рд░реНрдХ рдбрд┐рдЬрд╛рдЗрди рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢ рдХрд╣рддреЗ рд╣реИрдВ:

рдкреНрд░рддреНрдпреЗрдХ рдЕрддрд┐рднрд╛рд░рд┐рдд рдСрдкрд░реЗрдЯрд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрдХреВрд▓ рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рдзрд┐рдпрд╛рдВ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

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

рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, F# рдЙрди рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬреЛ рдирд┐рд╣рд┐рдд рд░реВрдкрд╛рдВрддрд░рдг рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЕрдЬреАрдм рдмрдирд╛рддрд╛ рд╣реИред


рд╕рд╛рде рд╣реА, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЪреАрдЬреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рддрд░реАрдХрд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдПрдкреАрдЖрдИ рдХреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдирд╛ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдЕрдЧрд░ рдореИрдВ рдХреБрдЫ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╣реИрд╢ рдХреЛрдб рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ HashCode.CombineHashCodes(value1, value2, value3) new HashCode().Combine(value1).Combine(value2).Combine(value3) рддреБрд▓рдирд╛ рдореЗрдВ рд╕рд░рд▓, рдЫреЛрдЯрд╛ рдФрд░ рд╕рдордЭрдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИред

рдЗрдВрд╕реНрдЯреЗрдВрд╕ рд╡рд┐рдзрд┐ рдПрдкреАрдЖрдИ рдЕрднреА рднреА рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рд░рд▓ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ рдПрдкреАрдЖрдИ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

@svick , рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреА рдмрд╛рдд рдЬреЛ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреА рд╣реИ, рд╡рд╣ рд╡реИрдз рд╣реИред рдореИрдВ рдЙрдкрдЬ, рдЪрд▓реЛ рдлрд┐рд░ Value рдЬреЛрдбрд╝реЗрдВред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЪреАрдЬреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рддрд░реАрдХрд╛ рд╣реЛрдирд╛ рдЗрддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдЕрдЧрд░ рдХреЛрдИ рдЗрд╕реЗ рдПрдХ рддрд░рд╣ рд╕реЗ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЙрд╕ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдХреЛрдб рдХреЛ рдкрдврд╝рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕реЗ рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЙрд╕реЗ Google рдХреЛ рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдЕрдЧрд░ рдореИрдВ рд╕рд┐рд░реНрдл рдХреБрдЫ рдорд╛рдиреЛрдВ рдХреЗ рд╣реИрд╢ рдХреЛрдб рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣реИрд╢рдХреЛрдбред рдХреЙрдореНрдмрд┐рди рд╣реИрд╢рдХреЛрдбреНрд╕ (рд╡реИрд▓реНрдпреВ 1, рд╡реИрд▓реНрдпреВ 2, рд╡реИрд▓реНрдпреВ 3) рдирдП рд╣реИрд╢рдХреЛрдб () рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рд░рд▓, рдЫреЛрдЯрд╛ рдФрд░ рд╕рдордЭрдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИред рдХреЙрдореНрдмрд┐рдиреЗрд╢рди (рд╡реИрд▓реНрдпреВ 1)ред рдХреЙрдореНрдмрд╛рдЗрди (рд╡реИрд▓реНрдпреВ 2)ред рдХреЙрдореНрдмрд╛рдЗрди ( рдорд╛рди 3)ред

  • рдПрдХ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐, рдЪреВрдВрдХрд┐ рдХреЛрдИ params int[] рдЕрдзрд┐рднрд╛рд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛,
  • рджреВрд╕рд░рд╛ рд░реВрдк рдПрдХ рдпрд╛ рджреЛ рдмрд╛рд░ рджреЗрдЦрдиреЗ рдкрд░ рд╕рдордЭрдиреЗ рдореЗрдВ рдЖрд╕рд╛рдиреА рд╣реЛрдЧреАред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЖрдк рддрд░реНрдХ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЕрдзрд┐рдХ рдкрдардиреАрдп рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд▓рдВрдмрд╡рдд рд░реВрдк рд╕реЗ рд╢реНрд░реГрдВрдЦрд▓рд╛рдмрджреНрдз рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ (рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЬрдм рдХреЛрдИ рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝рд╛/рдирд┐рдХрд╛рд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдЕрдВрддрд░ рдХрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ):
public override int GetHashCode()
{
    return new HashCode()
        .Combine(_field1)
        .Combine(_field2)
        .Combine(_field3)
        .Combine(_field4);
}

[@svick] рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЪреАрдЬреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рддрд░реАрдХрд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╣реА рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рднреНрд░рдо рд╕реЗ рдмрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рд╛рде рд╣реА, рд╣рдорд╛рд░рд╛ рд▓рдХреНрд╖реНрдп 100% рдУрд╡рд░рд▓реИрдкрд┐рдВрдЧ рдореБрдХреНрдд рд╣реЛрдирд╛ рдирд╣реАрдВ рд╣реИ рдпрджрд┐ рдпрд╣ рдЕрдиреНрдп рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдЦреЛрдЬ рдпреЛрдЧреНрдпрддрд╛, рд╕реБрд╡рд┐рдзрд╛, рдкреНрд░рджрд░реНрд╢рди рдпрд╛ рдкрдардиреАрдпрддрд╛ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╣рдорд╛рд░рд╛ рд▓рдХреНрд╖реНрдп рдПрдкреАрдЖрдИ рдХреЗ рдмрдЬрд╛рдп рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рдХрдо рдХрд░рдирд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╢рдмреНрджрд╛рд╡рд▓реА рдХреЗ рд╕рд╛рде рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХрд╛рдзрд┐рдХ рдЕрдзрд┐рднрд╛рд░ рдХрдо рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реИрдВред

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

рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рд╕рдорд╛рди рджрд┐рдЦрддрд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдВ рдврд╛рдВрдЪреЗ рдореЗрдВ рджрд┐рдЦрддреА рд╣реИрдВред рдФрд░ рдПрдкреАрдЖрдИ рдбрд┐рдЬрд╝рд╛рдЗрди рдореЗрдВ рд╣рдо рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдкрд░ рд╕реНрдерд┐рд░рддрд╛ рдХрд╛ рджреГрдврд╝рддрд╛ рд╕реЗ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред

[@svick] рдЕрдЧрд░ рдореИрдВ рд╕рд┐рд░реНрдл рдХреБрдЫ рдорд╛рдиреЛрдВ рдХреЗ рд╣реИрд╢ рдХреЛрдб рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣реИрд╢рдХреЛрдбред рдХреЙрдореНрдмрд┐рди рд╣реИрд╢рдХреЛрдбреНрд╕ (рд╡реИрд▓реНрдпреВ 1, рд╡реИрд▓реНрдпреВ 2, рд╡реИрд▓реНрдпреВ 3) рдирдП рд╣реИрд╢рдХреЛрдб () рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рд░рд▓, рдЫреЛрдЯрд╛ рдФрд░ рд╕рдордЭрдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИред рдХреЙрдореНрдмрд┐рдиреЗрд╢рди (рд╡реИрд▓реНрдпреВ 1)ред рдХреЙрдореНрдмрд┐рдиреЗрд╢рди (рд╡реИрд▓реНрдпреВ 2) )ред рдЧрдардмрдВрдзрди (рдорд╛рди 3)ред

рдореИрдВ @jamesqo рд╕реЗ рд╕рд╣рдордд

[@jamesqo] рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ/рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЙрдореНрдкреИрд░рд┐рд╕рди рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдЕрдзрд┐рднрд╛рд░ рдпрд╣рд╛рдВ рд╣реИ; рд╣реИрд╢рдХреЛрдб рдХрд╛ рддрд╛рд░ рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИ

рдирд┐рд╖реНрдкрдХреНрд╖ рдмрд┐рдВрджреБред рдореИрдВрдиреЗ рдЗрд╕реЗ рдЗрд╕рд▓рд┐рдП рдЬреЛрдбрд╝рд╛ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ @Eilon рдХреЗ рдХреЛрдб рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЕрдиреБрднрд╡ рд╕реЗ рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рддрд╛рд░ рдмрд╣реБрдд рдЖрдо рд╣реИрдВред рджреВрд╕рд░реА рдУрд░, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рддреБрд▓рдирд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реИред рдЖрдЗрдП рдЗрд╕реЗ рдЕрднреА рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджреЗрдВред

[@jamesqo] рд╣рдореЗрдВ рд▓рдВрдмреЗ рдЕрдзрд┐рднрд╛рд░ рдХреЛ рдПрдХ рдирдП рдкреНрд░рдХрд╛рд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред HashCode рдХреЗрд╡рд▓ 32 рдмрд┐рдЯ рдЪреМрдбрд╝рд╛ рд╣реЛрдЧрд╛; рдпрд╣ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ред

рдпреЗ рдПрдХ рдЕрдЪреНрдЫрд╛ рдмрд┐рдВрджреБ рд╣реИред рдХреНрдпрд╛ рд╣рдореЗрдВ long рд╕рдВрд╕реНрдХрд░рдг рдХреА рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдореИрдВрдиреЗ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП рдЫреЛрдбрд╝рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдореИрдВрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрд╛ рдерд╛ред

рдЕрдм рдЬрдм рдореИрдВ рд╣реВрдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХреЗрд╡рд▓ 32-рдмрд┐рдЯ рдЫреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдпрд╣реА .NET GetHashCode() рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред рдЙрд╕ рдирд╕ рдореЗрдВ, рдореБрдЭреЗ рдпрдХреАрди рднреА рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдореЗрдВ uint рд╕рдВрд╕реНрдХрд░рдг рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдЖрдк рдЙрд╕ рджрд╛рдпрд░реЗ рдХреЗ рдмрд╛рд╣рд░ рд╣реИрд╢рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд▓реЛрдЧреЛрдВ рдХреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ System.Security.Cryptography рдореЗрдВ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдЙрджреНрджреЗрд╢реНрдп рд╣реИрд╢рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдкрд░ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдареАрдХ рд╣реИред

```рд╕реА#
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕рдВрд░рдЪрдирд╛ рд╣реИрд╢рдХреЛрдб
{
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдереИрддрд┐рдХ рд╣реИрд╢рдХреЛрдб рдмрдирд╛рдПрдБ(рдЯреА рдУрдмреАрдЬреЗ);

[Pure] public HashCode Combine(int hashCode);
[Pure] public HashCode Combine<T>(T obj);

public int Value { get; }

public static implicit operator int(HashCode hashCode);

}
```

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

@terrajobst рдмрд╣реБрдд рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реИрд╢рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╣реИрдВ, рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЪрд┐рдбрд╝рд┐рдпрд╛рдШрд░ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╢рд╛рдпрдж 70% рдбрд┐рдЬрд╝рд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рдЧреИрд░-рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд╝рд┐рдХ рд╣реИрдВред рдФрд░ рд╢рд╛рдпрдж рдЙрдирдореЗрдВ рд╕реЗ рдЖрдзреЗ рд╕реЗ рдЕрдзрд┐рдХ 64+ рдмрд┐рдЯреНрд╕ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рд╣реИрдВ (рд╕рд╛рдорд╛рдиреНрдп рд▓рдХреНрд╖реНрдп 128/256 рд╣реИ)ред рдпрд╣ рдХрд┐ рдврд╛рдВрдЪреЗ рдиреЗ 32 рдмрд┐рдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рд╣реИ (рдореИрдВ рд╡рд╣рд╛рдВ рдирд╣реАрдВ рдЧрдпрд╛ рд╣реВрдВ) рдХреНрдпреЛрдВрдХрд┐ рдЙрд╕ рд╕рдордп x86 рдЕрднреА рднреА рдПрдХ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдЙрдкрднреЛрдХреНрддрд╛ рдерд╛ рдФрд░ рд╕рднреА рдЬрдЧрд╣ рд╣реИрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдХрдо рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкрд░ рдкреНрд░рджрд░реНрд╢рди рд╕рд░реНрд╡реЛрдкрд░рд┐ рдерд╛ред

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

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

рдУрд╡рд░рд╕рд┐рдореНрдкреНрд▓реАрдлрд┐рдХреЗрд╢рди рдХреЗ рдХрд╛рд░рдг рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╕рдорд╕реНрдпрд╛рдПрдВ рдХрднреА-рдХрднреА рдЬрдЯрд┐рд▓ рд╕рд╛рдордЧреНрд░реА рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рд╣реЛрдиреЗ рдкрд░ рдкреЗрд╢ рдХрд┐рдП рдЧрдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЗ рдореБрджреНрджреЛрдВ рд╕реЗ рднреА рдмрджрддрд░ рд╣реЛрддреА рд╣реИрдВред рдЗрддрдиреА рдмрдбрд╝реА рдбрд┐рдЧреНрд░реА рддрдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдирд╛ рдХреНрдпреЛрдВрдХрд┐ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ not being able to deal with having multiple options рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЖрд╕рд╛рдиреА рд╕реЗ SIMD рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЗ рдорд╛рд░реНрдЧ рдкрд░ рд▓реЗ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░рджрд░реНрд╢рди рдЬрд╛рдЧрд░реВрдХ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╣рд░ рдХреЛрдИ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░рджрд░реНрд╢рди рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рд╕реЗ рдирд┐рдкрдЯ рдирд╣реАрдВ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдРрд╕реЗ рдЕрдЪреНрдЫреЗ рдереНрд░реВрдкреБрдЯ рд▓рдХреНрд╖реНрдп рд╣реИрдВред

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

image

рд╕рд╛рде рд╣реА рдЬреИрд╕реЗ рд╣реА рдЖрдкрдХреЛ 75000 рд╕реЗ рдЕрдзрд┐рдХ рддрддреНрд╡реЛрдВ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рд╣реЛрддрд╛ рд╣реИ, рдЖрдкрдХреЗ рдкрд╛рд╕ рдЯрдХрд░рд╛рд╡ рд╣реЛрдиреЗ рдХреА 50% рд╕рдВрднрд╛рд╡рдирд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдпрд╣ рдЬреНрдпрд╛рджрд╛рддрд░ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ рдЦрд░рд╛рдм рд╣реИ (рдФрд░ рдпрд╣ рдорд╛рди рд░рд╣рд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИрд╢ рдлрд╝рдВрдХреНрд╢рди рд╣реИ)ред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ 64 рдмрд┐рдЯреНрд╕ рдФрд░ 128 рдмрд┐рдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рд░рдирдЯрд╛рдЗрдо рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреА рд╕реАрдорд╛рдУрдВ рдХреЗ рдмрд╛рд╣рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

int рдкрд░ рдЕрдЯрдХреЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЗ рд╕рд╛рде рд╣рдо рдХреЗрд╡рд▓ 2000 рдореЗрдВ рдордВрдбреЗ рдЕрдЦрд╝рдмрд╛рд░ рди рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдХрд╡рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ (рдЗрд╕рд▓рд┐рдП рдЕрдм рд╣рд░ рдХреЛрдИ рдЕрдкрдиреА рдЦрд░рд╛рдм рд╣реИрд╢рд┐рдВрдЧ рдЦреБрдж рд▓рд┐рдЦрддрд╛ рд╣реИ) рд▓реЗрдХрд┐рди рд╣рдо рдПрдХ рдХрджрдо рднреА рдЖрдЧреЗ рдирд╣реАрдВ рдмрдврд╝реЗрдВрдЧреЗред рдХрд▓рд╛ рдпрд╛ рддреЛред

рдЪрд░реНрдЪрд╛ рдореЗрдВ рдпрд╣ рдореЗрд░рд╛ 2 рд╕реЗрдВрдЯ рд╣реИред

@redknightlois , рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо int рд╣реИрд╢ рдХреА рд╕реАрдорд╛рдУрдВ рдХреЛ рд╕рдордЭрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдореИрдВ @terrajobst рд╕реЗ рд╕рд╣рдордд

рдЬрдм рддрдХ рдЖрдкрдХреЛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ 128 рдмрд┐рдЯреНрд╕ рдореЗрдВ рд╣реИрд╢ рд╕рдВрдпреЛрдЬрди рдХрд░рдирд╛ рдЕрднреА рднреА рдлрд╛рдпрджреЗрдордВрдж рд╣реИ рдФрд░ рдлрд┐рд░ int рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдкрд░рд┐рдгрд╛рдо GetHahsCode рд╕реЗ рд╡рд╛рдкрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред

@KrzysztofCwalina рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдпрд╣ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИрдВред рдПрдХ рддреЛ 2000 рдХреА рд╡рдЬрд╣ рд╕реЗ рд╣реБрдИ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рдирд╛ рд╣реИ; рд╕рд╛рдорд╛рдиреНрдп рд╣реИрд╢рд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд╣реИред рдпрджрд┐ рд╣рдо рд╕рднреА рд╕рд╣рдордд рд╣реИрдВ рдХрд┐ рдпрд╣ рдкреВрд░реНрд╡ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИ, рддреЛ рдЪрд░реНрдЪрд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдИ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, "рднрд╡рд┐рд╖реНрдп" рдореАрд▓ рдХрд╛ рдкрддреНрдерд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдбрд┐рдЬрд╛рдЗрди рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрдо рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдЬреНрдпрд╛рджрд╛рддрд░ рдЗрд╕рд▓рд┐рдП рдХрд┐ рд╣рдо рдпрд╣рд╛рдВ рдХреНрдпрд╛ рдХрд░реЗрдВрдЧреЗ рднрд╡рд┐рд╖реНрдп рдХреА рдЪрд░реНрдЪрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧрд╛ред рдпрд╣рд╛рдВ рдЧрд▓рддрд┐рдпрд╛рдВ рдХрд░рдиреЗ рд╕реЗ рдЕрд╕рд░ рдкрдбрд╝реЗрдЧрд╛ред

@redknightlois , рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡

@redknightlois

рдпрд╣рд╛рдВ рдЧрд▓рддрд┐рдпрд╛рдВ рдХрд░рдиреЗ рд╕реЗ рдЕрд╕рд░ рдкрдбрд╝реЗрдЧрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╣рдо рдФрд░ рдЕрдзрд┐рдХ рдЙрдиреНрдирдд рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕реЗ HashCode рд╕реЗ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рдирд┐рд░реНрдгрдп рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрди рдорд╛рдорд▓реЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореИрдВрдиреЗ рдЗрд╕рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджрд╛ рдмрдирд╛рдпрд╛ред

@redknightlois : +1:ред рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ, рдЖрдкрдиреЗ рдЕрдкрдиреА рдЯрд┐рдкреНрдкрдгреА рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЬрд╡рд╛рдм рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣реИрд╢ рдХреЛ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ (int, long, рджрд╢рдорд▓рд╡, рдЖрджрд┐) рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдФрд░ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдХреЛрд░ рд╣реИрд╢рд┐рдВрдЧ рддрд░реНрдХ рдХреЛ рдЕрдкрдирд╛рдиреЗ рдХреЗ рдЖрдкрдХреЗ рд╡рд┐рдЪрд╛рд░ (рдЙрдкрд░реЛрдХреНрдд) рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛: https://github.com/jamesqo/HashApi (рдирдореВрдирд╛ рдЙрдкрдпреЛрдЧ рдпрд╣рд╛рдВ рдерд╛)ред рд▓реЗрдХрд┐рди, рджреЛ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд╣реЛ рдЧрдП, рдФрд░ рдЬрдм рдореИрдВрдиреЗ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рддреЛ рд╕рдВрдХрд▓рдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛ред рддреЛ рд╣рд╛рдБ, рдЕрднреА рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджреЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЙрдиреНрдирдд рд╣реИрд╢рд┐рдВрдЧ рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред

@terrajobst рдПрдкреАрдЖрдИ рд▓рдЧрднрдЧ рддреИрдпрд╛рд░ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди 1 рдпрд╛ 2 рдФрд░ рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

  • рдореИрдВ рд╢реБрд░реВ рдореЗрдВ рд╕реНрдерд┐рд░ рдлрд╝реИрдХреНрдЯрд░реА рд╡рд┐рдзрд┐ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ HashCode.Create(x) рдХрд╛ рдкреНрд░рднрд╛рд╡ new HashCode().Combine(x) ред рд▓реЗрдХрд┐рди, рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдкрдирд╛ рд╡рд┐рдЪрд╛рд░ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ 1 рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реИрд╢ред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдХреНрдпреЛрдВ рдирд╛рдо рдмрджрд▓рдиреЗ рдирд╣реАрдВ рд╣реИ Create рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Combine ? рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рдлрд╝реАрд▓реНрдб рдХреЗ рд▓рд┐рдП рдПрдХ рдЪреАрдЬрд╝ рдЯрд╛рдЗрдк рдХрд░рдирд╛ рдФрд░ рджреВрд╕рд░реЗ рдлрд╝реАрд▓реНрдб рдХреЗ рд▓рд┐рдП рджреВрд╕рд░рд╛ рдЯрд╛рдЗрдк рдХрд░рдирд╛ рдереЛрдбрд╝рд╛ рдкрд░реЗрд╢рд╛рди рд╣реИред
  • рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ HashCode рдХреЛ IEquatable<HashCode> рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдХреБрдЫ рд╕рдорд╛рдирддрд╛ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдЖрдкрдХреЛ рдХреЛрдИ рдЖрдкрддреНрддрд┐ рд╣реЛ рддреЛ рдмреЗрдЭрд┐рдЭрдХ рдореБрдЭреЗ рдмрддрд╛рдПрдВред

(рдЙрдореНрдореАрдж рд╣реИ) рдЕрдВрддрд┐рдо рдкреНрд░рд╕реНрддрд╛рд╡:

public struct HashCode : IEquatable<HashCode>
{
    public static HashCode Combine(int hash);
    public static HashCode Combine<T>(T obj);

    public HashCode Combine(int hash);
    public HashCode Combine<T>(T obj);

    public int Value { get; }

    public static implicit operator int(HashCode hashCode);

    public static bool operator ==(HashCode left, HashCode right);
    public static bool operator !=(HashCode left, HashCode right);

    public override bool Equals(object obj);
    public override bool Equals(HashCode other);
    public override int GetHashCode();
}

// Usage:

public override int GetHashCode()
{
    return HashCode
        .Combine(_field1)
        .Combine(_field2)
        .Combine(_field3)
        .Combine(_field4);
}

@terrajobst рдиреЗ рдХрд╣рд╛:

рдирд┐рд╖реНрдкрдХреНрд╖ рдмрд┐рдВрджреБред рдореИрдВрдиреЗ рдЗрд╕реЗ рдЗрд╕рд▓рд┐рдП рдЬреЛрдбрд╝рд╛ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ @Eilon рдХреЗ рдХреЛрдб рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЕрдиреБрднрд╡ рд╕реЗ рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рддрд╛рд░ рдмрд╣реБрдд рдЖрдо рд╣реИрдВред рджреВрд╕рд░реА рдУрд░, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рддреБрд▓рдирд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реИред рдЖрдЗрдП рдЗрд╕реЗ рдЕрднреА рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджреЗрдВред

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ: рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд▓рд┐рдП рд╣реИрд╢ рдмрдирд╛рдиреЗ рдореЗрдВ рдЕрдХреНрд╕рд░ рдЙрд╕ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЗрд╕рдХреА рд╕рдВрд╕реНрдХреГрддрд┐ рдФрд░ рдЗрд╕рдХреА рдХреЗрд╕-рд╕рдВрд╡реЗрджрдирд╢реАрд▓рддрд╛ рджреЛрдиреЛрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреА рд╣реИред StringComparer рдкреНрд░рддрд┐ рддреБрд▓рдирд╛ рддреБрд▓рдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рд╡рд┐рд╢рд┐рд╖реНрдЯ GetHashCode рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ рдЬреЛ рд╕рдВрд╕реНрдХреГрддрд┐/рдХреЗрд╕-рдЬрд╛рдЧрд░реВрдХ рд╣реИрдВред

рдЗрд╕ рдПрдкреАрдЖрдИ рдХреЗ рдмрд┐рдирд╛, рдЖрдкрдХреЛ рдХреБрдЫ рдЕрдЬреАрдм рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреИрд╕реЗ:

HashCode.Combine(str1.ToLowerInvariant()).Combine(str2.ToLowerInvariant())

рдФрд░ рд╡рд╣ рдЖрд╡рдВрдЯрди рд╕реЗ рднрд░рд╛ рд╣реБрдЖ рд╣реИ, рдЦрд░рд╛рдм рд╕рдВрд╕реНрдХреГрддрд┐-рд╕рдВрд╡реЗрджрдирд╢реАрд▓рддрд╛ рдкреИрдЯрд░реНрди рдЖрджрд┐ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИред

@Eilon рдРрд╕реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдореИрдВ рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдХреЛрдб рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ string.GetHashCode(StringComparison comparison) рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдХрд┐ рд╕рдВрд╕реНрдХреГрддрд┐/рдорд╛рдорд▓рд╛-рдЬрд╛рдЧрд░реВрдХ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ int рдореЗрдВ Combine ред

c# HashCode.Combine(str1.GetHashCode(StringComparer.Ordinal)).Combine(...)

@Eilon , рдЖрдк рдмрд╕ StringComparer.InvariantCultureIgnoreCase.GetHashCode рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЖрд╡рдВрдЯрди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╡реЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдХреЙрд▓ рджреЗрдЦрдиреЗ рдореЗрдВ рд╕реБрдВрджрд░ рдирд╣реАрдВ рд╣реИрдВ ... рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреВрд░реЗ ASP.NET рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реИ рдЬрд╣рд╛рдВ рд╣реИрд╢ рдХреЛ рд╕рдВрд╕реНрдХреГрддрд┐/рдХреЗрд╕-рдЕрд╡реЗрдпрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ, рдКрдкрд░ рдмрддрд╛рдИ рдЧрдИ рд╕рднреА рдмрд╛рддреЛрдВ рдХреЛ рдорд┐рд▓рд╛рдХрд░, рдЗрд╕ рдЖрдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕рд╛ рд╣реЛрдЧрд╛:

``` рд╕реА#
рдиреЗрдорд╕реНрдкреЗрд╕ рд╕рд┐рд╕реНрдЯрдо
{
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕рдВрд░рдЪрдирд╛ рд╣реИрд╢рдХреЛрдб: IEquatable
{
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдереИрддрд┐рдХ рд╣реИрд╢рдХреЛрдб рдХрдореНрдмрд╛рдЗрди (рдЗрдВрдЯ рд╣реИрд╢);
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдереИрддрд┐рдХ рд╣реИрд╢рдХреЛрдб рд╕рдВрдпреЛрдЬрди(рдЯреА рдУрдмреАрдЬреЗ);
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдереИрддрд┐рдХ рд╣реИрд╢рдХреЛрдб рдХрдореНрдмрд╛рдЗрди (рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЯреЗрдХреНрд╕реНрдЯ, рд╕реНрдЯреНрд░рд┐рдВрдЧ рддреБрд▓рдирд╛ рддреБрд▓рдирд╛);

    public HashCode Combine(int hash);
    public HashCode Combine<T>(T obj);
    public HashCode Combine(string text, StringComparison comparison);

    public int Value { get; }

    public static implicit operator int(HashCode hashCode);

    public static bool operator ==(HashCode left, HashCode right);
    public static bool operator !=(HashCode left, HashCode right);

    public override bool Equals(object obj);
    public override bool Equals(HashCode other);
    public override int GetHashCode();
}

}

// рдЙрдкрдпреЛрдЧ:

рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдУрд╡рд░рд░рд╛рдЗрдб int GetHashCode ()
{
рд╡рд╛рдкрд╕реА HashCode.Combine(_field1)
.Combine(_field2)
.Combine(_field3)
.Combine(_field4);
}
```

рдЗрд╕реЗ рднреЗрдЬ рджреЛ! :-)

@terrajobst _Hold on--_ Combine(string, StringComparison) рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

public static class HashCodeExtensions
{
    public static HashCode Combine(this HashCode hashCode, string text, StringComparison comparison)
    {
        switch (comparison)
        {
            case StringComparison.Ordinal:
                return HashCode.Combine(StringComparer.Ordinal.GetHashCode(text));
            case StringComparison.OrdinalIgnoreCase:
                ...
        }
    }
}

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

( рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ System.Numerics рд╢рд╛рдпрдж рдПрдХ рдмреЗрд╣рддрд░ рдирд╛рдорд╕реНрдерд╛рди рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рд╣реИрд╢-рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИрдВред рдЬреЗрдиреЗрд░рд┐рдХ рдЖрдЬ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореБрдЭреЗ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИред)

рдПрд▓рдЬреАрдЯреАрдПрдоред рдореИрдВ рд╡рд┐рд╕реНрддрд╛рд░ рдЬрд╛рдКрдВрдЧрд╛ред

рд╣рд╛рдБ, рдпрд╣ рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд┐рд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рддреА рд╣реИ?

@terrajobst

рд╣рд╛рдБ, рдпрд╣ рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд┐рд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рддреА рд╣реИ?

рдореИрдВ ASP.NET рдХреЛрдб рдореЗрдВ рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣рд╛ рдерд╛ред рдпрджрд┐ рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ, рддреЛ рдпрд╣ рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ/рдРрдкреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдЪ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдмрд╛рдж рдореЗрдВ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдп рд╣реИ, рддреЛ рд╣рдо рд╣рдореЗрд╢рд╛ рдкреБрдирд░реНрдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред

Mhhh рдпрд╣ рд╡реИрд╕реЗ рднреА рдХреЛрд░ рд╣реИред рдПрдХ рдмрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдпрд╣ рд╡реИрд╕реЗ рднреА рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрдЧрд╛ред рдЯрд┐рдкреНрдкрдгреА рд╕реНрдХреНрд░реИрдк рдХрд░реЗрдВред рдпрд╣ рдЬреИрд╕рд╛ рд╣реИ рдареАрдХ рд╣реИред

рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрди рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ рдЬрд╣рд╛рдВ:

  1. рдпрд╣ рдПрдХ рдореМрдЬреВрджрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдкрдбреЗрдЯ рдХреЛ рд╢рд┐рдк рдХрд┐рдП рдмрд┐рдирд╛ рдмрдврд╝рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ
  2. рд▓реЗрдпрд░рд┐рдВрдЧ рдореБрджреНрджреЛрдВ рдХреЛ рд╣рд▓ рдХрд░реЗрдВ
  3. рд╕реБрдкрд░ рдХреЙрдорди рдПрдкреАрдЖрдИ рдХреЛ рдмрд╣реБрдд рдХрдо рдЗрд╕реНрддреЗрдорд╛рд▓ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдПрдкреАрдЖрдИ рд╕реЗ рдЕрд▓рдЧ рдХрд░реЗрдВред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ (1) рдпрд╛ (2) рдпрд╣рд╛рдВ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВред (3) рдХреЗрд╡рд▓ рддрднреА рдорджрдж рдХрд░реЗрдЧрд╛ рдЬрдм рд╣рдо рдХреЛрдб рдХреЛ HashCode рд╕реЗ рднрд┐рдиреНрди рдЕрд╕реЗрдВрдмрд▓реА рдореЗрдВ рд▓реЗ рдЬрд╛рдПрдВрдЧреЗ рдпрд╛ рдпрджрд┐ рд╣рдо рдЗрд╕реЗ рдХрд┐рд╕реА рднрд┐рдиреНрди рдирд╛рдорд╕реНрдерд╛рди рдкрд░ рд▓реЗ рдЬрд╛рдПрдВрдЧреЗред рдореИрдВ рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ рддрд╛рд░ рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдп рд╣реИрдВ рдХрд┐ рдпрд╣ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореИрдВ рдпрд╣ рднреА рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ рд╡реЗ рдЗрддрдиреЗ рд╕рд╛рдорд╛рдиреНрдп рд╣реИрдВ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рдХреГрддреНрд░рд┐рдо рд░реВрдк рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░ рдкреНрд░рдХрд╛рд░ рдкрд░ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

@terrajobst , рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣рд╛ рдерд╛ рдХрд┐ string API рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рдЯрд╛ рджреЗрдВ, рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╡рд┐рдзрд┐ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ ASP.NET рдкрд░ рдЫреЛрдбрд╝ рджреЗрдВред

рдореИрдВ рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ рддрд╛рд░ рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдп рд╣реИрдВ рдХрд┐ рдпрд╣ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореИрдВ рдпрд╣ рднреА рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ рд╡реЗ рдЗрддрдиреЗ рд╕рд╛рдорд╛рдиреНрдп рд╣реИрдВ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рдХреГрддреНрд░рд┐рдо рд░реВрдк рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░ рдкреНрд░рдХрд╛рд░ рдкрд░ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

рд╣рд╛рдВ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдЧреИрд░-рдХреНрд░рдорд┐рдХ рд╣реИрд╢ рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдХрд┐рддрдирд╛ рдЖрдо рд╣реИ, рдЬреЛ рдПрдХрдорд╛рддреНрд░ рдкрд░рд┐рджреГрд╢реНрдп рд╣реИ рдЬреЛ рдореМрдЬреВрджрд╛ Combine<T> рдЕрдзрд┐рднрд╛рд░ рдХрд╛ рдЦреНрдпрд╛рд▓ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИ? (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╣реИ рдЬреЛ StringComparer.CurrentCulture.GetHashCode рдХреЛ рдЙрдирдХреЗ рдУрд╡рд░рд░рд╛рдЗрдб рдореЗрдВ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ?) рдореИрдВ рдЧрд▓рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдХрдИ рд▓реЛрдЧреЛрдВ рдХреЛ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИред

рдЗрд╕ рдкрд░ рдкреБрд╢рдмреИрдХ рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ; рдпрд╣ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реИ рдХрд┐ рдПрдХ рдмрд╛рд░ рдПрдкреАрдЖрдИ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

рд╣рд╛рдВ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдЧреИрд░-рдХреНрд░рдорд┐рдХ рд╣реИрд╢ рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдХрд┐рддрдирд╛ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ?

рдореИрдВ рдкрдХреНрд╖рдкрд╛рддреА рд╣реЛ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдХреЗрд╕ рдЗрдирд╡реЗрд░рд┐рдПрдВрд╕ рдХрд╛рдлреА рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реИред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдХрдИ (рдпрджрд┐ рдХреЛрдИ рд╣реИрдВ) рд╕рдВрд╕реНрдХреГрддрд┐-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИрд╢-рдХреЛрдб рдХреА рджреЗрдЦрднрд╛рд▓ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣реИрд╢-рдХреЛрдб рдЬреЛ рдЖрд╡рд░рдг рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ - рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @Eilon рдмрд╛рдж рдореЗрдВ рд╣реИ (рдЬреЛ StringComparison.OrdinalIgnoreCase )ред

рдЗрд╕ рдкрд░ рдкреБрд╢рдмреИрдХ рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ; рдпрд╣ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реИ рдХрд┐ рдПрдХ рдмрд╛рд░ рдПрдкреАрдЖрдИ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

рдХреЛрдИ рдордЬрд╝рд╛рдХ рдирд╣реАрдВ ЁЯШИ рд╕рд╣рдордд, рд▓реЗрдХрд┐рди рднрд▓реЗ рд╣реА рдПрдкреАрдЖрдИ рдХрд╛ рдЙрддрдирд╛ рдЙрдкрдпреЛрдЧ рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ, рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реИ рдФрд░ рдЗрд╕рд╕реЗ рдХреЛрдИ рдиреБрдХрд╕рд╛рди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

@terrajobst рдареАрдХ рд╣реИ, рдЗрд╕реЗ рдЬреЛрдбрд╝реЗрдВ: +1: рдЕрдВрддрд┐рдо рдЕрдВрдХ: рдореИрдВрдиреЗ рдКрдкрд░ рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣рдо рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдмрдЬрд╛рдп рдиреЗрдорд╕реНрдкреЗрд╕ рдиреНрдпреВрдореЗрд░рд┐рдХреНрд╕ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЬреЗрдиреЗрд░рд┐рдХ? рдЕрдЧрд░ рд╣рдо рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рд╣реИрд╢рд┐рдВрдЧ-рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬреИрд╕реЗ

рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рд╣реИред рдореИрдВ

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИрд╢рд┐рдВрдЧ рд╡реИрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдЖрддрд╛ рд╣реИред System.Runtime рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?

рдореИрдВ рд╡рд╣реА рд╕реБрдЭрд╛рд╡ рджреЗрдиреЗ рдЬрд╛ рд░рд╣рд╛ рдерд╛, рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ System. рдпрд╣ рдиреНрдпреВрдореЗрд░рд┐рдХреНрд╕ рднреА рдирд╣реАрдВ рд╣реИред

@karelz , System.Runtime рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред @redknightlois рд╕рд┐рд╕реНрдЯрдо рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╣реА рдЙрд╕ рдиреЗрдорд╕реНрдкреЗрд╕ рдХреЛ рдЖрдпрд╛рдд рдХрд░ рдЪреБрдХреЗ рд╣реИрдВред рдбреБрдиреЛ рдЕрдЧрд░ рдпрд╣ рдЙрдЪрд┐рдд рд╣реЛрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ (рдлрд┐рд░ рд╕реЗ, рдпрджрд┐ рдЕрдзрд┐рдХ рд╣реИрд╢рд┐рдВрдЧ рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВ)ред

рд╣рдореЗрдВ рдЗрд╕реЗ System.Runtime рдореЗрдВ рдирд╣реАрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЧреВрдврд╝ рдФрд░ рдХрд╛рдлреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИред рдореИрдВрдиреЗ @KrzysztofCwalina рд╕реЗ рдмрд╛рдд рдХреА рдФрд░ рд╣рдо рджреЛрдиреЛрдВ рдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рджреЛрдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ:

  • System
  • System.Collections.*

рд╣рдо рджреЛрдиреЛрдВ System рдУрд░ рдЭреБрдХрддреЗ рд╣реИрдВред

рдЕрдЧрд░ рд╣рдореЗрдВ System рд▓рд┐рдП рдЬрд╛рдиреЗ рдХрд╛ рдФрдЪрд┐рддреНрдп рд╣реИ рддреЛ рдореИрдВ рдПрдХ рдФрдЪрд┐рддреНрдп рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рд╣рдордиреЗ HashCode рдХреЛ object.GetHashCode() рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рд╣реИ, рдпрд╣ рдЙрдЪрд┐рдд рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рджреЛрдиреЛрдВ рдирд╛рдорд╕реНрдерд╛рди рд╕рд╛рдЭрд╛ рдХрд░реЗрдВрдЧреЗред

@terrajobst рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ System рдирд╛рдорд╕реНрдерд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЪрд▓реЛ :рд╢рд┐рдкрд┐рдЯ:

рд╡рд┐рд╡рд░рдг рдореЗрдВ API рдпреБрдХреНрддрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ред

[@redknightlois] рдЕрдЧрд░ рд╣рдореЗрдВ System рд▓рд┐рдП рдЬрд╛рдиреЗ рдХрд╛ рдФрдЪрд┐рддреНрдп рдЪрд╛рд╣рд┐рдП рддреЛ рдореИрдВ рдПрдХ рдФрдЪрд┐рддреНрдп рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рд╣рдордиреЗ HashCode рдХреЛ object.GetHashCode() рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рд╣реИ, рдпрд╣ рдЙрдЪрд┐рдд рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рджреЛрдиреЛрдВ рдирд╛рдорд╕реНрдерд╛рди рд╕рд╛рдЭрд╛ рдХрд░реЗрдВрдЧреЗред

рдпрд╣реА рдХрд╛рд░рдг рдерд╛ рдХрд┐ @KrzysztofCwalina рдФрд░ рдореИрдВрдиреЗ рднреА рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ред рдмреЗрдЪрд╛!

@jamesqo

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдкреАрдЖрд░ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рднреА рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?

@terrajobst рд╣рд╛рдБ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗред рдЗрд╕рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рд╣рд╛рдБ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗред

рдорд┐рдард╛рдИред рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдореИрдВ рдЗрд╕реЗ рдЖрдкрдХреЛ рд╕реМрдВрдк рджреВрдВрдЧрд╛ред рдпрд╣ рдЖрдкрдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫрд╛ рд╣реИ @karelz?

рдЗрд╕рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рдПрдкреАрдЖрдИ рдЖрдХрд╛рд░ рдкрд░ рд╣рдорд╛рд░реЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдЖрдЧреЗ рдФрд░ рдкреАрдЫреЗ рдЬрд╛рдирд╛ рдПрдХ рджрд░реНрджрдирд╛рдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рд╣рдо рдЖрдкрдХреЗ рдзреИрд░реНрдп рдХреА рдЕрддреНрдпрдзрд┐рдХ рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддреЗ рд╣реИрдВ!

рдФрд░ рдореИрдВ ASP.NET рдХреЛрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╣рдЯрд╛рдиреЗ рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╢рд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ

рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдереИрддрд┐рдХ рд╣реИрд╢рдХреЛрдб рдХрдореНрдмрд╛рдЗрди (рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЯреЗрдХреНрд╕реНрдЯ, рд╕реНрдЯреНрд░рд┐рдВрдЧ рддреБрд▓рдирд╛ рддреБрд▓рдирд╛);
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╣реИрд╢рдХреЛрдб рдХрдореНрдмрд╛рдЗрди (рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЯреЗрдХреНрд╕реНрдЯ, рд╕реНрдЯреНрд░рд┐рдВрдЧ рддреБрд▓рдирд╛ рддреБрд▓рдирд╛);

рдирд┐рдЯ: рдкрд░ рддрд░реАрдХреЛрдВ String рдХрд┐ рд▓реЗ StringComparison (рдЬреИрд╕реЗ Equals , Compare , StartsWith , EndsWith , рдЖрджрд┐ ред) рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ comparisonType рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рди рдХрд┐ comparison ред рдХреНрдпрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ comparisonType рдирд╛рдо рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╕рд╛рде рд╣реА рд╕реБрд╕рдВрдЧрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?

@justinvp , рдЬреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рдирд╛рдордХрд░рдг рджреЛрд╖ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ; Type рдмреЗрдорд╛рдиреА рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдореЗрдВ рдкреБрд░рд╛рдиреЗ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде "рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ" рдХреЗ рд▓рд┐рдП рдирдП рдПрдкреАрдЖрдИ рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╛рдореЛрдВ рдХреЛ рдЕрдзрд┐рдХ рд╡рд░реНрдмреЛрдЬрд╝ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдПрдХ рдЕрдиреНрдп рдбреЗрдЯрд╛ рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ, xUnit рдиреЗ comparisonType рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪреБрдирд╛ред

@justinvp рдЖрдкрдиреЗ рдореБрдЭреЗ рдЖрд╢реНрд╡рд╕реНрдд рдХрд┐рдпрд╛ рд╣реИред рдЕрдм рдЬрдм рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╣рдЬ рд░реВрдк рд╕реЗ рд╕реЛрдЪрддрд╛ рд╣реВрдВ, "рдХреЗрд╕-рдЕрд╕рдВрд╡реЗрджрдирд╢реАрд▓" рдпрд╛ "рд╕рдВрд╕реНрдХреГрддрд┐-рдирд┐рд░реНрднрд░" рддреБрд▓рдирд╛ рдХрд╛ рдПрдХ 'рдкреНрд░рдХрд╛рд░' рд╣реИред рдореИрдВ рдирд╛рдо рдмрджрд▓ рджреВрдВрдЧрд╛ред

рдореИрдВ рдЗрд╕рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рдареАрдХ рд╣реВрдВ, рд▓реЗрдХрд┐рди StringComparison рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд┐рдХрд▓реНрдк:

рд╢рд╛рдорд┐рд▓ рди рдХрд░реЗрдВ:

``` рд╕реА#
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдереИрддрд┐рдХ рд╣реИрд╢рдХреЛрдб рдХрдореНрдмрд╛рдЗрди (рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЯреЗрдХреНрд╕реНрдЯ, рд╕реНрдЯреНрд░рд┐рдВрдЧ рддреБрд▓рдирд╛ рддреБрд▓рдирд╛);
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╣реИрд╢рдХреЛрдб рдХрдореНрдмрд╛рдЗрди (рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЯреЗрдХреНрд╕реНрдЯ, рд╕реНрдЯреНрд░рд┐рдВрдЧ рддреБрд▓рдирд╛ рддреБрд▓рдирд╛);

Instead, add a method:

``` C#
public class StringComparer
{
    public static StringComparer FromComparison(StringComparison comparison);
    ...
}

рдлрд┐рд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрдЬрд╛рдп:

``` рд╕реА#
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдУрд╡рд░рд░рд╛рдЗрдб int GetHashCode ()
{
рд╡рд╛рдкрд╕реА HashCode.Combine(_field1)
.Combine(_field2)
.Combine(_field3)
.Combine(_field4, _comparison);
}

you write:

``` C#
public override int GetHashCode()
{
    return HashCode.Combine(_field1)
                   .Combine(_field2)
                   .Combine(_field3)
                   .Combine(StringComparer.FromComparison(_comparison).GetHashCode(_field4));
}

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

C# public override int GetHashCode() { return HashCode.Combine(_field1) .Combine(_field2) .Combine(_field3) .Combine(_comparer.GetHashCode(_field4)); }

@stephentoub , FromComparison рдПрдХ рдЕрдЪреНрдЫреЗ рд╡рд┐рдЪрд╛рд░ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред рдореИрдВрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ string.GetHashCode(StringComparison) рдПрдкреАрдЖрдИ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрд╛рдЧреЗ рдореЗрдВ рдКрдкрд░ рдХреА рдУрд░ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдФрд░ рднреА рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ (рдЧреИрд░-рд╢реВрдиреНрдп рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рдирддреЗ рд╣реБрдП):

public override int GetHashCode()
{
    return HashCode.Combine(_field1)
                   .Combine(_field2)
                   .Combine(_field3)
                   .Combine(_field4.GetHashCode(_comparison));
}

@Elion рдиреЗ рдХрд╣рд╛ рдХрд┐ рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреЙрд▓ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

(рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЖрдкрдХреЗ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдмрдирд╛рдпрд╛ред)

рдореИрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП HashCode рдкрд░ 2 рд╡рд┐рд╢реЗрд╖ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рднреА рдирд╛рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред
@Eilon рдЖрдкрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ ASP.NET рдХреЛрд░ рдореЗрдВ рд╣реА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдкрдХреЛ рдХреНрдпрд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд╛рд╣рд░реА рдбреЗрд╡рд▓рдкрд░ рдЗрд╕рдХрд╛ рдХрд┐рддрдирд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ?

@jamesqo рдбрд┐рдЬрд╛рдЗрди рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдЬреИрд╕рд╛ рдХрд┐ @terrajobst рдиреЗ рдХрд╣рд╛, рд╣рдо рдЖрдкрдХреА рдорджрдж рдФрд░ рдзреИрд░реНрдп рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддреЗ рд╣реИрдВред рдореМрд▓рд┐рдХ рдЫреЛрдЯреЗ рдПрдкреАрдЖрдИ рдХреЛ рдХрднреА-рдХрднреА рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░рдиреЗ рдореЗрдВ рдХреБрдЫ рд╕рдордп рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ :)ред

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдо рдПрдкреАрдЖрдИ рдлреАрдбрдмреИрдХ рдХреЗ рдЗрд╕ рдЕрдВрддрд┐рдо рднрд╛рдЧ рдХреЗ рд╕рд╛рде рдХрд╣рд╛рдВ рдЙрддрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рд╣рдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдХреНрдпрд╛ рдХреЛрдИ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

C# public static HashCode Combine<T>(T obj, IEqualityComparer<T> cmp);

?

(рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдЕрдЧрд░ рд╡рд╣ рдкрд╣рд▓реЗ рд╣реА рдЦрд╛рд░рд┐рдЬ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдореИрдВ рдЗрд╕реЗ рдпрд╣рд╛рдВ рдпрд╛рдж рдХрд░ рд░рд╣рд╛ рд╣реВрдВ)ред

@stephentoub рдиреЗ рдХрд╣рд╛:

рд▓рд┐рдЦреЛ:

c# public override int GetHashCode() { return HashCode.Combine(_field1) .Combine(_field2) .Combine(_field3) .Combine(StringComparer.FromComparison(_comparison).GetHashCode(_field4)); }

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


рдЦреИрд░, рдпрд╣ рдереЛрдбрд╝рд╛ рд▓рдВрдмрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдмрд╣реБрдд рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЪрд▓рдиреЗ рдЬреИрд╕рд╛ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рд╢реВрдиреНрдп рдЦреЛрдЬ рдпреЛрдЧреНрдпрддрд╛ рд╣реИред

рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рддрд┐рд░реЛрдз рдХреНрдпрд╛ рд╣реИ? рдпрджрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реИ, рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рдореЗрдВ рдХреЛрдИ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕реЗ рдХреНрдпреЛрдВ рди рдЬреЛрдбрд╝реЗрдВ?

рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрдерд┐рд░ рд╕рд╣рд╛рдпрдХ/рд░реВрдкрд╛рдВрддрд░рдг рд╡рд┐рдзрд┐ рдареАрдХ рд╣реИ - рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ - рд▓реЗрдХрд┐рди рд╕реБрд╡рд┐рдзрд╛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдХреАрдордд рдкрд░ рдХреНрдпреЛрдВ?

рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХреЛрдВ рдХреА рдХреАрдордд рдкрд░ рдХреНрдпреЛрдВ?

рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рд╕реБрд╡рд┐рдзрд╛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ ASP.NET рдЗрд╕реЗ рд╡рд┐рднрд┐рдиреНрди рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдХрд░рддрд╛ рд╣реИред рдХрд┐рддрдиреА рдЬрдЧрд╣? рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдХрд┐рддрдиреЗ рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЪрд░ StringComparison рд╣реИ рдЬреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдЬреНрдЮрд╛рдд рдореВрд▓реНрдп рдХреЗ рдмрдЬрд╛рдп рд╣реИ? рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдкрдХреЛ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдмрддрд╛рдП рдЧрдП рд╕рд╣рд╛рдпрдХ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдмрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

``` рд╕реА#
.Combine(StringComparer.InvariantCulture.GetHashCode(_field4))

which in no way seems onerous to me or any more undiscoverable than knowing about StringComparison and doing:

``` C#
.Combine(_field4, StringComparison.InvariantCulture);

рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рддреЗрдЬрд╝ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдареАрдХ рд╡рд╣реА рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдВрдмрд╛рдЗрди рдХреЗ рдЕрдВрджрд░ рд╢рд╛рдЦрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ рдЬреЛ рджреЗрд╡ рд▓рд┐рдЦ рд╕рдХрддрд╛ рдерд╛ред рдХреНрдпрд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдб рдЗрддрдиреА рдЕрд╕реБрд╡рд┐рдзрд╛ рд╣реИ рдХрд┐ рдЙрд╕ рдПрдХ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдЕрдзрд┐рднрд╛рд░ рдЬреЛрдбрд╝рдиреЗ рд▓рд╛рдпрдХ рд╣реИ? StringComparer рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рднрд╛рд░ рдХреНрдпреЛрдВ рдирд╣реАрдВ? EqualityComparer рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рднрд╛рд░ рдХреНрдпреЛрдВ рдирд╣реАрдВ? Func<T, int> рд▓реЗрдиреЗ рд╡рд╛рд▓реЗ рдУрд╡рд░рд▓реЛрдб рдХреНрдпреЛрдВ рдирд╣реАрдВ? рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рдЖрдк рд░реЗрдЦрд╛ рдЦреАрдВрдЪрддреЗ рд╣реИрдВ рдФрд░ рдХрд╣рддреЗ рд╣реИрдВ, "рдпрд╣ рдЕрдзрд┐рднрд╛рд░ рдЬреЛ рдореВрд▓реНрдп рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИ", рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЬреЛ рдХреБрдЫ рднреА рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рд╡рд╣ рд▓рд╛рдЧрдд рдкрд░ рдЖрддрд╛ рд╣реИ, рдЪрд╛рд╣реЗ рд╡рд╣ рд░рдЦрд░рдЦрд╛рд╡ рдХреА рд▓рд╛рдЧрдд рд╣реЛ, рдХреЛрдб рдЖрдХрд╛рд░ рдХреА рд▓рд╛рдЧрдд, рдЬреЛ рдХреБрдЫ рднреА рд▓рд╛рдЧрдд , рдФрд░ рдЕрдЧрд░ рджреЗрд╡ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рджреЗрд╡ рдХреЗ рд▓рд┐рдП рдХрдо рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдорд▓реЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рдХрдо рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдб рд╣реИред рддреЛ рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣рд╛ рдерд╛ рдХрд┐ рд░реЗрдЦрд╛ рдЦреАрдВрдЪрдиреЗ рдХрд╛ рд╕рд╣реА рд╕реНрдерд╛рди рдмрд╛рдж рдХреЗ рдмрдЬрд╛рдп рдЗрди рдЕрдзрд┐рднрд╛рд░реЛрдВ рд╕реЗ рдкрд╣рд▓реЗ рд╣реИ (рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдЕрдкрдиреА рдкрд┐рдЫрд▓реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХрд╣рд╛ рдерд╛, "рдореИрдВ рдЗрд╕рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рдареАрдХ рд╣реВрдВ", рдФрд░ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣рд╛ рдерд╛) .

рдпрд╣рд╛рдБ рдореИрдВрдиреЗ рдЬреЛ рдЦреЛрдЬ рдХреА рд╣реИ: https://github.com/search?p=2&q=user%3Aaspnet+hashcodecombiner&type=Code&utf8=%E2%9C%93

~ 100 рдореИрдЪреЛрдВ рдореЗрдВ рд╕реЗ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдкрд╣рд▓реЗ рдХреБрдЫ рдкреГрд╖реНрдареЛрдВ рд╕реЗ рднреА рд▓рдЧрднрдЧ рд╣рд░ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рддрд╛рд░ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рд╕реНрдЯреНрд░рд┐рдВрдЧ рддреБрд▓рдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

  1. рд╕рд╛рдорд╛рдиреНрдп: https://github.com/aspnet/Razor/blob/77ed9f22fc8894fbce796bb8a704d6cd03a3b226/src/Microsoft.AspNetCore.Razor.TagHelpers.Testing.Sources/TagHelperAttribute.cs#L46Comparer
  2. рд╕рд╛рдзрд╛рд░рдг + рдЗрдЧреНрдиреЛрд░рдХреЗрд╕: https://github.com/aspnet/Razor/blob/bdbb854bdbde260b3c70f565a93ebbb185a7c5a7/src/Microsoft.AspNetCore.Razor/Compilation/TagHelpers/TagHelperRequiredAttributeDescriptor
  3. рд╕рд╛рдорд╛рдиреНрдп: https://github.com/aspnet/Razor/blob/bdbb854bdbde260b3c70f565a93ebbb185a7c5a7/src/Microsoft.AspNetCore.Razor/Chunks/Generators/AttributeBlockChunkGenerator.cs#L58
  4. рд╕рд╛рдорд╛рдиреНрдп: https://github.com/aspnet/Razor/blob/77ed9f22fc8894fbce796bb8a704d6cd03a3b226/src/Microsoft.AspNetCore.Razor.TagHelpers.Testing.Sources/TagHelperDesignTimeDescript#LComparer.cs
  5. рд╕рд╛рдорд╛рдиреНрдп: https://github.com/aspnet/Razor/blob/dbcb6901209859e471c9aa978912cf7d6c178668/src/Microsoft.AspNetCore.Razor.Evolution/Legacy/AttributeBlockChunkGenerator.cs#L56
  6. рд╕рд╛рдорд╛рдиреНрдп: https://github.com/aspnet/Razor/blob/77ed9f22fc8894fbce796bb8a704d6cd03a3b226/src/Microsoft.AspNetCore.Razor.TagHelpers.Testing.Sources/CaseSensitiveTagHelper.cs#L62Comparer
  7. рд╕рд╛рдзрд╛рд░рдг + рдЗрдЧреНрдиреЛрд░рдХреЗрд╕: https://github.com/aspnet/dnx/blob/bebc991012fe633ecac69675b2e892f568b927a5/src/Microsoft.Dnx.Tooling/NuGet/Core/PackageSource/PackageSource.cs#L107
  8. рд╕рд╛рдорд╛рдиреНрдп: https://github.com/aspnet/Razor/blob/bdbb854bdbde260b3c70f565a93ebbb185a7c5a7/src/Microsoft.AspNetCore.Razor/Tokenizer/Symbols/SymbolBase.cs#L52
  9. рд╕рд╛рдорд╛рдиреНрдп: https://github.com/aspnet/Razor/blob/77ed9f22fc8894fbce796bb8a704d6cd03a3b226/src/Microsoft.AspNetCore.Razor.TagHelpers.Testing.Sources/CaseSensitiveTagHelperAttribute
  10. рд╕рд╛рдорд╛рдиреНрдп: https://github.com/aspnet/Razor/blob/77ed9f22fc8894fbce796bb8a704d6cd03a3b226/src/Microsoft.AspNetCore.Razor.TagHelpers.Testing.Sources/TagHelperAttributeComparerDesignTimeDescriptor

(рдФрд░ рджрд░реНрдЬрдиреЛрдВ рдЕрдиреНрдпред)

рддреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ ASP.NET рдХреЛрд░ рдХреЛрдбрдмреЗрд╕ рдХреЗ рднреАрддрд░ рдпрд╣ рдПрдХ рдЕрддреНрдпрдВрдд рд╕рд╛рдорд╛рдиреНрдп рдкреИрдЯрд░реНрди рд╣реИред рдмреЗрд╢рдХ рдореИрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдмрд╛рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред

~100 рдореИрдЪреЛрдВ рдореЗрдВ рд╕реЗ

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

``` рд╕реА#
.Combine(Name, StringComparison.OrdinalIgnoreCase)

``` C#
.Combine(StringComparer.OrdinalIgnoreCase.GetHashCode(Name))

? рдпрд╣ "рд╡рд╛рдпрд╛ рд╕реБрдкрд░ рд▓рдВрдмрд╛" рдирд╣реАрдВ рд╣реИ рдФрд░ рдпрд╣ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдореБрдЭреЗ рдХреБрдЫ рдпрд╛рдж рдирд╣реАрдВ рдЖ рд░рд╣рд╛ рд╣реИред

рд╡реИрд╕реЗ рднреА, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛ рд╣реИ, рдореИрдВ рдмрд╕ рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рдпреЗ рдЕрдзрд┐рднрд╛рд░ рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред рдпрджрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓реЛрдЧ рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рд╣реИрдВ, рдФрд░ рд╣рдо рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ ASP.NET рдХреЛрдбрдмреЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдареАрдХ рд╣реИред

рд╕рдВрдмрдВрдзрд┐рдд, рд╣рдо рдХрд┐рд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП рдЕрд╢рдХреНрдд рдЗрдирдкреБрдЯ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ? рдЗрдВрдЯ == 0 рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдореИрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЕрдзрд┐рднрд╛рд░ рдХреЗ рд▓рд┐рдП рдФрд░ рдЕрдзрд┐рдХ рд▓рд╛рдн рджреЗрдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдпрджрд┐ рд╣рдо рдирд▓ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ StringComparer.GetHashCode рдЖрдо рддреМрд░ рдкрд░ рдПрдХ рд╢реВрдиреНрдп рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рдлреЗрдВрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдо рд╣реИ, рддреЛ рдХреЙрд▓рд░ рдХреЗ рдкрд╛рд╕ рдпрд╣ рдЕрдзрд┐рдХ рдмреЛрдЭрд┐рд▓ рд╣реЛрдиреЗ рд▓рдЧрддрд╛ рд╣реИ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рд╢реВрдиреНрдпред рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрд╛рдж рдпрд╣ рднреА рд╕рд╡рд╛рд▓ рдЙрдарддрд╛ рд╣реИ рдХрд┐ рдЬрдм рд╢реВрдиреНрдп рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ред рдХреНрдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдорд╛рди рдХреЗ рд╕рд╛рде рд╣реИрд╢ рдХреЛрдб рдореЗрдВ 0 рдорд┐рд▓рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ? рдХреНрдпрд╛ рдЗрд╕реЗ рдПрдХ рдПрдирдУрдкреА рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╣реИрд╢рдХреЛрдб рдЕрдХреЗрд▓рд╛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?

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

рджрд░рдЕрд╕рд▓, рдореЗрд░рд╛ рд╡реЛрдЯ ASP.NET Core рдХреЗ рдХреЛрдбрдмреЗрд╕ рдХреЗ рдирдЬрд░рд┐рдП рд╕реЗ рдЖрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдПрдХ рдУрд╡рд░рд▓реЛрдб рдЬреЛ рдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ-рдЕрд╡реЗрдпрд░ рд╣реИ, рдмрд╣реБрдд рдорджрджрдЧрд╛рд░ рд╣реЛрдЧрд╛ред рд▓рд╛рдЗрди-рд▓реЗрдВрде рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪреАрдЬреЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрд░реА рдореБрдЦреНрдп рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ рдереАрдВ, рдмрд▓реНрдХрд┐ рдЦреЛрдЬ рдпреЛрдЧреНрдпрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереАрдВред

рдпрджрд┐ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ-рдЕрд╡реЗрдпрд░ рдУрд╡рд░рд▓реЛрдб рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рдерд╛, рддреЛ рд╣рдо рдХреЗрд╡рд▓ ASP.NET рдХреЛрд░ рдореЗрдВ рдПрдХ рдЖрдВрддрд░рд┐рдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВрдЧреЗ рдФрд░ рдЙрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рдпрджрд┐ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ-рдЕрд╡реЗрдпрд░ рдУрд╡рд░рд▓реЛрдб рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рдерд╛, рддреЛ рд╣рдо рдХреЗрд╡рд▓ ASP.NET рдХреЛрд░ рдореЗрдВ рдПрдХ рдЖрдВрддрд░рд┐рдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВрдЧреЗ рдФрд░ рдЙрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

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

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

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

  1. рд╣рдо @Eilon рдЬреИрд╕реЗ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЛ рдмрд╣реБрдд рдЖрд╕рд╛рди рдмрдирд╛рддреЗ рд╣реИрдВред
  2. рд╣рдо рдЗрд╕реЗ рдЦреЛрдЬрдиреЗ рдпреЛрдЧреНрдп рдмрдирд╛рддреЗ рд╣реИрдВ рдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреА рддреБрд▓рдирд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХреЗрд╕рд┐рдВрдЧред

рд╣рдореЗрдВ рдпрд╣ рднреА рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐ @Eilon рдЬреИрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ рдкреНрд░рд╛рдердорд┐рдХ рдЪрд┐рдВрддрд╛ рд╡рд┐рд╢реЗрд╖ рдЖрд╡рд░рдг string рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ:

``` рд╕реА#
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕рдВрд░рдЪрдирд╛ рд╣реИрд╢рдХреЛрдб: IEquatable
{
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╣реИрд╢рдХреЛрдб рдЧрдардмрдВрдзрди(рдЯреА рдУрдмреАрдЬреЗ, рдЖрдИрдИрдХреНрд╡рд╛рд▓рд┐рдЯреА рдХрдВрдкреЗрдпрд░рд░рддреБрд▓рдирд╛рдХрд░реНрддрд╛);
}

// рдЙрдкрдпреЛрдЧ
рд╡рд╛рдкрд╕реА HashCode.Combine(_numberField)
.Combine(_stringField, StringComparer.OrdinalIgnoreCase);
```

@terrajobst , рдЖрдкрдХрд╛ рд╕рдордЭреМрддрд╛ рдПрдХ рдЪрддреБрд░ рд╣реИред рдореБрдЭреЗ рдкрд╕рдВрдж рд╣реИ рдХрд┐ рдЕрдм рдЖрдкрдХреЛ GetHashCode рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдпрд╛ рдХрд╕реНрдЯрдо рддреБрд▓рдирд╛рдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдХреЛрд╖реНрдардХ рдХреЗ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реЗрдЯ рдХреЛ рдШреЛрдВрд╕рд▓рд╛ рдмрдирд╛рдирд╛ рд╣реИред

(рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХрд╛ рд╢реНрд░реЗрдп @JonHanna рдХреЛ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдкрд╣рд▓реЗ рдзрд╛рдЧреЗ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдерд╛? )

@ рдЬреЛрдирд╣рдиреНрдирд╛ рд╣рд╛рдВ, рд╣рдо 0 рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИрд╢ рдирд▓ рдЗрдирдкреБрдЯ рднреА рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред

рдпрд╣рд╛рдВ рдмрд╛рддрдЪреАрдд рдореЗрдВ рдмрд╛рдзрд╛ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИред рд▓реЗрдХрд┐рди, рдореБрдЭреЗ рдирдпрд╛ рдкреНрд░рдХрд╛рд░ рдХрд╣рд╛рдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП? @mellinoe @ericstj @weshaggard , рдХреНрдпрд╛ рдЖрдк рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдореИрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдЕрд╕реЗрдВрдмрд▓реА/рдкреИрдХреЗрдЬ System.HashCode , рдпрд╛ рдХреНрдпрд╛ рдореБрдЭреЗ рдЗрд╕реЗ рдореМрдЬреВрджрд╛ рдЕрд╕реЗрдВрдмрд▓реА рдЬреИрд╕реЗ System.Runtime.Extensions рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП? рдзрдиреНрдпрд╡рд╛рджред

рд╣рдордиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ .NET рдХреЛрд░ рдореЗрдВ рдЕрд╕реЗрдВрдмрд▓реА рд▓реЗрдЖрдЙрдЯ рдХреЛ рдХрд╛рдлреА рд╣рдж рддрдХ рджреЛрдмрд╛рд░рд╛ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИ; рдореИрдВ рдЗрд╕реЗ рд╡рд╣рд╛рдВ рд░рдЦрдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ рдареЛрд╕ рддреБрд▓рдирд╛рдХрд░реНрддрд╛ рд░рд╣рддреЗ рд╣реИрдВ, рдЬреЛ System.Runtime.Extensions рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВред

@weshaggard?

@terrajobst рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реА, рдореБрдЭреЗ рдЕрднреА рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╣рдо рджреЛрдиреЛрдВ рд╕реНрдерд┐рд░ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдУрд╡рд░рд▓реЛрдб Combine рдирд╛рдо рдирд╣реАрдВ рджреЗ рд╕рдХрддреЗ, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗред рдореИрдВ

рд╕рдВрдХрд▓рдХ рддреНрд░реБрдЯрд┐ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рдгрд╛рдо рд╣реЛрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЙрджрд╛рд╣рд░рдг рдФрд░ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рдорд╛рди рдирд╛рдо рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:

using System;
using System.Collections.Generic;

public struct HashCode
{
    public void Combine(int i)
    {
    }

    public static void Combine(int i)
    {
    }
}

рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 2 рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ:

  • Create , Seed , рдЖрджрд┐ рдЬреИрд╕реЗ рдХреБрдЫ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рд░ рдЕрдзрд┐рднрд╛рд░ рдХрд╛ рдирд╛рдо рдмрджрд▓реЗрдВред
  • рд╕реНрдерд┐рд░ рдЕрдзрд┐рднрд╛рд░ рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕реНрдерд┐рд░ рд╡рд░реНрдЧ рдореЗрдВ рд▓реЗ рдЬрд╛рдПрдВ:
public static class Hash
{
    public static HashCode Combine(int hash);
}

public struct HashCode
{
    public HashCode Combine(int hash);
}

// Usage:
return Hash.Combine(_field1)
           .Combine(_field2)
           .Combine(_field3);

рдореИрдВ рджреВрд╕рд░реЗ рдХреЗ рдкреНрд░рддрд┐ рддрд░рдЬреАрд╣реА рд╣реВрдБред рдпрд╣ рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди... рд╡рд┐рдЪрд╛рд░?

рддрд░реНрдХ рдХреЛ 2 рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдЕрд▓рдЧ рдХрд░рдирд╛ рдореЗрд░реЗ рд▓рд┐рдП рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИ - HashCode рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп Hash рд╡рд░реНрдЧ рд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдореИрдВ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп Create рд╡рд┐рдзрд┐ (рдпрд╛ Seed рдпрд╛ Init )
рдореИрдВ рдиреЛ-рдЖрд░реНрдЧ рдУрд╡рд░рд▓реЛрдб рднреА рдЬреЛрдбрд╝реВрдВрдЧрд╛ HashCode.Create().Combine(_field1).Combine(_field2) ред

@karelz , рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЕрдЧрд░ рдпрд╣ рд╡рд╣реА рдирд╛рдо рдирд╣реАрдВ рд╣реИ рддреЛ рд╣рдореЗрдВ рдлрд╝реИрдХреНрдЯрд░реА рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рдиреА рдЪрд╛рд╣рд┐рдПред рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдкреИрд░рд╛рдореАрдЯрд░ рд░рд╣рд┐рдд рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, new , рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдзрд┐рдХ рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдИ рд▓реЛрдЧреЛрдВ рдХреЛ new HashCode().Combine рд▓рд┐рдЦрдиреЗ рд╕реЗ рдирд╣реАрдВ рд░реЛрдХ рд╕рдХрддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рд╣реИред

public override int GetHashCode()
{
    return new HashCode()
        .Combine(_field1)
        ...
}

рдпрд╣ рд╕реАрдзреЗ рд╣реИрд╢ рдХреЛрдб рд╕реЗ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп 0 рдФрд░ _field1 рдХреЗ рд╣реИрд╢ рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрдпреЛрдЬрди рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рд╡рд░реНрддрдорд╛рди рд╣реИрд╢ рдХрд╛ рдПрдХ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдпрд╣ рд╣реИ рдХрд┐ 0 рдХреЛ рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕реЗ рд╢реВрдиреНрдп рдкрд░ рдШреБрдорд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд╢реВрдиреНрдп рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ред рдФрд░ рдЬрдм 0 рдХреЛ рдкрд╣рд▓реЗ рд╣реИрд╢ рдХреЛрдб рдХреЗ рд╕рд╛рде xored рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдХреЗрд╡рд▓ рдкрд╣рд▓рд╛ рд╣реИрд╢ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ред рддреЛ рдЕрдЧрд░ рдЬреЗрдЖрдИрдЯреА рдирд┐рд░рдВрддрд░ рддрд╣ рдореЗрдВ рдХреЛрдИ рдЕрдЪреНрдЫрд╛ рд╣реИ (рдФрд░ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ xor рджреВрд░ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ), рдЕрд╕рд▓ рдореЗрдВ рдпрд╣ рдкреНрд░рддреНрдпрдХреНрд╖ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдПрдкреАрдЖрдИ (рдЕрджреНрдпрддрди рдпреБрдХреНрддрд┐):

namespace System
{
    public struct HashCode : IEquatable<HashCode>
    {
        public HashCode Combine(int hash);
        public HashCode Combine<T>(T obj);
        public HashCode Combine<T>(T obj, IEqualityComparer<T> comparer);

        public int Value { get; }

        public static implicit operator int(HashCode hashCode);

        public static bool operator ==(HashCode left, HashCode right);
        public static bool operator !=(HashCode left, HashCode right);

        public override bool Equals(object obj);
        public override bool Equals(HashCode other);
        public override int GetHashCode();
    }
}

@redknightlois @JonHanna @stephentoub @Eilon рд▓рд┐рдП, рдЖрдкрдХреЛ рдлрд╝реИрдХреНрдЯрд░реА рд╡рд┐рдзрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд┐рд░реНрдорд╛рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдмрдирд╛рдо рдкрд░ рдПрдХ рд░рд╛рдп рд╣реИ? рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╕рдВрдХрд▓рдХ рд╕реНрдерд┐рд░ Combine рдЕрдзрд┐рднрд╛рд░ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрджрд╛рд╣рд░рдг рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╛ рддреЛ рд╡рд┐рдХрд▓реНрдк рд╣реИ

HashCode.Create(field1).Combine(field2) // ...

// or, using default constructor

new HashCode().Combine(field1).Combine(field2) // ...

рдкрд╣рд▓реЗ рдХрд╛ рдлрд╛рдпрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдереЛрдбрд╝рд╛ рдЯреЗрд╕рд░ рд╣реИред рджреВрд╕рд░реЗ рдХрд╛ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рд▓рдЧрд╛рддрд╛рд░ рдирд╛рдордХрд░рдг рд╣реЛрдЧрд╛ рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрд▓рдЧ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдПрдХ рдФрд░ рд╕рдВрднрд╛рд╡рдирд╛ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреА рд╣реИ, рдПрдХ Combine рдлреИрдХреНрдЯреНрд░реА рдХреЗ рд╕рд╛рде, рдПрдХ Combine рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЗ рд╕рд╛рде (рдпрд╛ рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░ рдкрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рджреВрд╕рд░рд╛)ред

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдХреМрди рд╕рд╛ рдЯреАрдмреАрдПрдЪ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред

@ рдЬреЛрдирд╣рдиреНрдирд╛ , рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдУрд╡рд░рд▓реЛрдб рдХреЗ рд╕рд╛рде рдЖрдкрдХрд╛ рджреВрд╕рд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИред рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ hc.Combine(obj) рд╕реНрдерд┐рд░ рдЕрдзрд┐рднрд╛рд░ рдкрд░ рд▓реЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ: TryRoslyn ред

рдореИрдВрдиреЗ рдКрдкрд░ рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╕реНрдерд┐рд░ рд╡рд░реНрдЧ рд░рдЦрдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджрд┐рдпрд╛, рдЬреЛ рдореБрдЭреЗ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реИ ... @karelz , рдЖрдкрдиреЗ рдХрд╣рд╛

рддрд░реНрдХ рдХреЛ 2 рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдЕрд▓рдЧ рдХрд░рдирд╛ рдореЗрд░реЗ рд▓рд┐рдП рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИ - рд╣реИрд╢рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╣реИрд╢ рдХреНрд▓рд╛рд╕ рд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рд▓реЛрдЧреЛрдВ рдХреЛ рдХреНрдпрд╛ рд╕рдВрдмрдВрдз рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛? рдХреНрдпрд╛ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдкрд╣рд▓реЗ Hash рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рдХрд░рд╛рдПрдВрдЧреЗ, рдФрд░ рдлрд┐рд░ рд╡рд╣рд╛рдВ рд╕реЗ рд╡реЗ HashCode ? рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдПрдХ рдирдпрд╛ рд╕реНрдерд┐рд░ рд╡рд░реНрдЧ рдЬреЛрдбрд╝рдирд╛ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реЛрдЧреАред

рддрд░реНрдХ рдХреЛ 2 рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдЕрд▓рдЧ рдХрд░рдирд╛ рдореЗрд░реЗ рд▓рд┐рдП рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИ - рд╣реИрд╢рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╣реИрд╢ рдХреНрд▓рд╛рд╕ рд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рд╣рдо рд╢реАрд░реНрд╖-рд╕реНрддрд░реАрдп рдкреНрд░рдХрд╛рд░ HashCode рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдШреЛрдВрд╕рд▓рд╛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдПрдкреАрдЖрдИ рдХреЗ "рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ" рдХреЛ рдПрдХ рд╢реАрд░реНрд╖-рд╕реНрддрд░реАрдп рдкреНрд░рдХрд╛рд░ рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рд╡рд╛рдВрдЫрд┐рдд рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

``` рд╕реА#
рдиреЗрдорд╕реНрдкреЗрд╕ рд╕рд┐рд╕реНрдЯрдо
{
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдереИрддрд┐рдХ рд╡рд░реНрдЧ рд╣реИрд╢рдХреЛрдб
{
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдереИрддрд┐рдХ рд╣реИрд╢рдХреЛрдбрд╡реИрд▓реНрдпреВ рдХреЙрдореНрдмрд┐рдиреЗрд╢рди (рдЗрдВрдЯ рд╣реИрд╢);
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдереИрддрд┐рдХ рд╣реИрд╢рдХреЛрдбрд╡реИрд▓реНрдпреВ рдХрдореНрдмрд╛рдЗрди(рдЯреА рдУрдмреАрдЬреЗ);
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдереИрддрд┐рдХ рд╣реИрд╢рдХреЛрдбрд╡реИрд▓реНрдпреВ рдХрдореНрдмрд╛рдЗрди(рдЯреА рдУрдмреАрдЬреЗ, рдЖрдИрдИрдХреНрд╡рд╛рд▓рд┐рдЯреА рдХрдВрдкреЗрдпрд░рд░рддреБрд▓рдирд╛рдХрд░реНрддрд╛);

    public struct HashCodeValue : IEquatable<HashCodeValue>
    {
        public HashCodeValue Combine(int hash);
        public HashCodeValue Combine<T>(T obj);
        public HashCodeValue Combine<T>(T obj, IEqualityComparer<T> comparer);

        public int Value { get; }

        public static implicit operator int(HashCodeValue hashCode);

        public static bool operator ==(HashCodeValue left, HashCodeValue right);
        public static bool operator !=(HashCodeValue left, HashCodeValue right);

        public bool Equals(HashCodeValue other);
        public override bool Equals(object obj);
        public override int GetHashCode();
    }
}

}
```

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╢рд╛рдпрдж рдиреЗрд╕реНрдЯреЗрдб рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП HashCodeValue рд╕реЗ рдмреЗрд╣рддрд░ рдирд╛рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдпрджрд┐ рд╣рдо рдЗрд╕ рдкрде рд╕реЗ рдиреАрдЪреЗ рдЬрд╛рддреЗ рд╣реИрдВ рддреЛ HashCodeValue.Value рдереЛрдбрд╝рд╛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реИ, рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ Value рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЕрдХреНрд╕рд░ред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ Value рд╕рдВрдкрддреНрддрд┐ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛ - рдпрджрд┐ рдЖрдк int рдбрд╛рд▓рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдк Value рдорд╛рдзреНрдпрдо рд╕реЗ GetHashCode() рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@justinvp рдкрд╣рд▓реА рдмрд╛рд░ рдореЗрдВ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рд╣реЛрдиреЗ рдореЗрдВ рдХреНрдпрд╛ рд╕рдорд╕реНрдпрд╛ рд╣реИ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдкреНрд░рдгрд╛рд▓реА LinkedList<T> рдФрд░ LinkedListNode<T> рд▓рд┐рдП рдареАрдХ рдХрд╛рдо рдХрд░рддреА рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдкрд╣рд▓реА рдмрд╛рд░ рдореЗрдВ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рд╣реЛрдиреЗ рдореЗрдВ рдХреНрдпрд╛ рд╕рдорд╕реНрдпрд╛ рд╣реИ?

рджреЛ рд╢реАрд░реНрд╖-рд╕реНрддрд░реАрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рджреЛ рдЪрд┐рдВрддрд╛рдПрдБ рд╣реИрдВ:

  1. рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП "рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ" рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИ? рдпрджрд┐ рдирд╛рдо Hash рдФрд░ HashCode , рддреЛ рдЖрдк рдХрд┐рд╕рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ? рдЙрди рдирд╛рдореЛрдВ рд╕реЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред LinkedList<T> рдФрд░ LinkedListNode<T> рдпрд╣ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рдореБрдЦреНрдп рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рд╣реИ, LinkedList<T> , рдФрд░ рдХреМрди рд╕рд╛ рд╕рд╣рд╛рдпрдХ рд╣реИред
  2. System рдирд╛рдо рд╕реНрдерд╛рди рдХреЛ рдкреНрд░рджреВрд╖рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрд╣ рдЙрддрдирд╛ рдЕрдзрд┐рдХ рдЪрд┐рдВрддрд╛ рдХрд╛ рд╡рд┐рд╖рдп рдирд╣реАрдВ рд╣реИ (1), рд▓реЗрдХрд┐рди рдХреБрдЫ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рд╣рдо System рдиреЗрдорд╕реНрдкреЗрд╕ рдореЗрдВ рдирдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред

рдиреЗрд╕реНрдЯрд┐рдВрдЧ рдЗрди рдЪрд┐рдВрддрд╛рдУрдВ рдХреЛ рдХрдо рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред

@justinvp

рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП "рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ" рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИ? рдпрджрд┐ рдирд╛рдо рд╣реИрд╢ рдФрд░ рд╣реИрд╢рдХреЛрдб рд╣реИрдВ, рддреЛ рдЖрдк рдХрд┐рд╕рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ? рдЙрди рдирд╛рдореЛрдВ рд╕реЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред LinkedList . рдХреЗ рд╕рд╛рдердФрд░ LinkedListNodeрдпрд╣ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдореБрдЦреНрдп рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдХреМрди рд╕рд╛ рд╣реИ, LinkedList, рдФрд░ рдЬреЛ рдПрдХ рд╕рд╣рд╛рдпрдХ рд╣реИред

рдареАрдХ рд╣реИ, рдХрд╛рдлреА рдЙрдЪрд┐рдд рдмрд┐рдВрджреБред рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рдкреНрд░рдХрд╛рд░ Hash рдФрд░ HashValue , рди рдХрд┐ рдШреЛрдВрд╕рд▓реЗ рдХреЗ рдкреНрд░рдХрд╛рд░? рдХреНрдпрд╛ рдпрд╣ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмреАрдЪ рдПрдХ рдЕрдзреАрдирд╕реНрде рд╕рдВрдмрдВрдз рдХреЛ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдирд┐рд░реВрдкрд┐рдд рдХрд░реЗрдЧрд╛?

рдпрджрд┐ рд╣рдо рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдлрд╝реИрдХреНрдЯрд░реА рд╡рд┐рдзрд┐ рдФрд░ рднреА рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реЛ рдЬрд╛рддреА рд╣реИ: Hash.Combine(field1).Combine(field2) ред рд╕рд╛рде рд╣реА, рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рд╕рдВрд░рдЪрдирд╛ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрднреА рднреА рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЛрдИ рд╣реИрд╢ рдХреА рдПрдХ рд╕реВрдЪреА рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ, рдФрд░ рдкрд╛рдардХ рдПрдХ рдХреЛ рдпрд╣ рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд╛рд╣рддреЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ List<HashValue> рдПрдХ рдХреЗ рдмрдЬрд╛рдп рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ List<int> ред рдпрджрд┐ рд╣рдо рдиреЗрд╕реНрдЯреЗрдб рдкреНрд░рдХрд╛рд░ рдмрдирд╛рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ: List<HashCode.HashCodeValue> (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ List<Hash.Value> рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ рдереЛрдбрд╝реЗ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ)ред

рд╕рд┐рд╕реНрдЯрдо рдиреЗрдорд╕реНрдкреЗрд╕ рдХреЛ рдкреНрд░рджреВрд╖рд┐рдд рдХрд░рдирд╛ред рдпрд╣ рдЙрддрдирд╛ рдЪрд┐рдВрддрд╛ рдХрд╛ рд╡рд┐рд╖рдп рдирд╣реАрдВ рд╣реИ рдЬрд┐рддрдирд╛ (1), рд▓реЗрдХрд┐рди рдХреБрдЫ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рд╕рд┐рд╕реНрдЯрдо рдиреЗрдорд╕реНрдкреЗрд╕ рдореЗрдВ рдирдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред

рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╣рдо рдкрд░рдВрдкрд░рд╛ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ рдФрд░ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЖрд╕рд╛рдиреА рдХрд╛ рддреНрдпрд╛рдЧ рди рдХрд░реЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ рдмреАрд╕реАрдПрд▓ рдПрдкреАрдЖрдИ рдореИрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдиреЗрд╕реНрдЯреЗрдб рдкреНрд░рдХрд╛рд░ рд╣реИрдВ (рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╕рдВрдЧреНрд░рд╣ рдЧрд┐рдирддреА рдирд╣реАрдВ рд╣реИрдВ, рд╡реЗ рдврд╛рдВрдЪреЗ рдХрд╛ рд╕рдЦреНрддреА рд╕реЗ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИрдВ) List<T>.Enumerator , рдЬрд╣рд╛рдВ рд╣рдо рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдиреЗрд╕реНрдЯреЗрдб рдХреЛ рдЫрд┐рдкрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЯрд╛рдЗрдк рдХрд░реЗрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрдВрдкрд╛рдЗрд▓рд░ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╣реИред рд╣рдо рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рд╡реИрд▓реНрдпреВ рдкреНрд░реЙрдкрд░реНрдЯреА рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛ - рдпрджрд┐ рдЖрдк рдЗрдВрдЯ рдореЗрдВ рдбрд╛рд▓рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдк GetHashCode() рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡реИрд▓реНрдпреВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЛрдЪрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХреИрд╕реЗ рдкрддрд╛ рдЪрд▓реЗрдЧрд╛ рдХрд┐ рдкреНрд░рдХрд╛рд░ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддрд╛ рд╣реИ GetHashCode , рдпрд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдПрдХ рдирд┐рд╣рд┐рдд рдСрдкрд░реЗрдЯрд░ рд╣реИ?

рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдПрдкреАрдЖрдИ

public static class Hash
{
    public static HashValue Combine(int hash);
    public static HashValue Combine<T>(T obj);
    public static HashValue Combine<T>(T obj, IEqualityComparer<T> comparer);
}

public struct HashValue : IEquatable<HashValue>
{
    public HashValue Combine(int hash);
    public HashValue Combine<T>(T obj);
    public HashValue Combine<T>(T obj, IEqualityComparer<T> comparer);

    public int Value { get; }

    public static implicit operator int(HashValue hashValue);

    public static bool operator ==(HashValue left, HashValue right);
    public static bool operator !=(HashValue left, HashValue right);

    public override bool Equals(object obj);
    public bool Equals(HashValue other);
    public override int GetHashCode();
}

рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдордиреЗ рд╣реИрд╢ рдФрд░ рд╣реИрд╢рд╡реИрд▓реНрдпреВ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдирд╛рдо рджрд┐рдпрд╛ рд╣реИ, рди рдХрд┐ рдШреЛрдВрд╕рд▓реЗ рдХреЗ рдкреНрд░рдХрд╛рд░?

Hash рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдирд╛рдо рд╕реЗ рдмрд╣реБрдд рд╕рд╛рдорд╛рдиреНрдп рд▓рдЧрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдПрдкреАрдЖрдИ рдХреЗ рдирд╛рдо рдкрд░ HashCode рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдЗрдЪреНрдЫрд┐рдд рдЙрджреНрджреЗрд╢реНрдп GetHashCode() рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдирд╛ рд╣реИ, рди рдХрд┐ GetHash() ред

рдХреЛрдИ рд╣реИрд╢ рдХреА рдПрдХ рд╕реВрдЪреА рдПрдХрддреНрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдФрд░ рдкрд╛рдардХ рдХреЛ рдЗрд╕реЗ рдПрдХ рд╕реВрдЪреА рдореЗрдВ рд╕рдВрд╡рд╛рдж рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИList . рдХреЗ рдмрдЬрд╛рдп рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ. рдпрджрд┐ рд╣рдо рдиреЗрд╕реНрдЯреЗрдб рдкреНрд░рдХрд╛рд░ рдмрдирд╛рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ: рд╕реВрдЪреА(рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕реВрдЪреАрдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ рдереЛрдбрд╝рд╛ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ)ред

рдпрд╣ рдПрдХ рдЕрд╕рдВрднрд╛рд╡рд┐рдд рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ - рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХреЗрд╡рд▓ рдмреАрд╕реАрдПрд▓ рдПрдкреАрдЖрдИ рдореИрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдиреЗрд╕реНрдЯреЗрдб рдкреНрд░рдХрд╛рд░ рд╣реИрдВ

TimeZoneInfo.AdjustmentRule рдФрд░ TimeZoneInfo.TransitionTime рдмреАрд╕реАрдПрд▓ рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЬрд╛рдирдмреВрдЭрдХрд░ рдиреЗрд╕реНрдЯреЗрдб рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред

@justinvp

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдПрдВрдЯреНрд░реА рдкреЙрдЗрдВрдЯ рдПрдкреАрдЖрдИ рдХреЗ рдирд╛рдо рдкрд░ рд╣реИрд╢рдХреЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдЧреЗрдЯрд╣рд╛рд╢рдХреЛрдб () рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдирд╛ рд╣реИ, рди рдХрд┐ рдЧреЗрдЯрд╣рд╛рд╢ ()ред

рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдБред

рдореИрдВрдиреЗ рдЪреАрдЬреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ рд╕реЛрдЪрд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдиреЗрд╕реНрдЯреЗрдб рд╕рдВрд░рдЪрдирд╛ рд╣реЛрдирд╛ рдЙрдЪрд┐рдд рд╣реИ; рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓реЛрдЧ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЛ рдХрднреА рдирд╣реАрдВ рджреЗрдЦ рдкрд╛рдПрдВрдЧреЗред рдмрд╕ рдПрдХ рдмрд╛рдд: рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ Seed рдХреЗ рдмрдЬрд╛рдп HashCodeValue рдХрд╣рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рдирд╛рдо рдХрд╛ рд╕рдВрджрд░реНрдн рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдпреБрдХреНрдд рд╡рд░реНрдЧ рджреНрд╡рд╛рд░рд╛ рдирд┐рд╣рд┐рдд рд╣реИред

рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдПрдкреАрдЖрдИ

namespace System
{
    public static class HashCode
    {
        public static Seed Combine(int hash);
        public static Seed Combine<T>(T obj);
        public static Seed Combine<T>(T obj, IEqualityComparer<T> comparer);

        public struct Seed : IEquatable<Seed>
        {
            public Seed Combine(int hash);
            public Seed Combine<T>(T obj);
            public Seed Combine<T>(T obj, IEqualityComparer<T> comparer);

            public int Value { get; }

            public static implicit operator int(Seed seed);

            public static bool operator ==(Seed left, Seed right);
            public static bool operator !=(Seed left, Seed right);

            public bool Equals(Seed other);
            public override bool Equals(object obj);
            public override int GetHashCode();
        }
    }
}

@jamesqo рдЗрд╕рдХреЗ рдмрдЬрд╛рдп public readonly int Value рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде рдХреЛрдИ рдЖрдкрддреНрддрд┐ рдпрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рдорд╕реНрдпрд╛? Seed рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдкрд╣рд▓реЗ рд╕рдВрдпреЛрдЬрди рдХреЗ рдмрд╛рдж рдХрд╛ рдмреАрдЬ рдирд╣реАрдВ рд╣реИред

@justinvp рд╕реЗ рднреА рд╕рд╣рдордд рд╣реИрдВ, Hash рдХреЛ рд╣реИрд╢ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп HashCode рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

@redknightlois рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдирд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рдереЗ, рди рдХрд┐ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдирд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред

        public struct Seed : IEquatable<Seed>
        {
            public Seed Combine(int hash);
            public Seed Combine<T>(T obj);
            public Seed Combine<T>(T obj, IEqualityComparer<T> comparer);

            public int Value { get; }

            public static implicit operator int(Seed seed);

            public static bool operator ==(Seed left, Seed right);
            public static bool operator !=(Seed left, Seed right);

            public bool Equals(Seed other);
            public override bool Equals(object obj);
            public override int GetHashCode();
        }

рдЙрдкрдпреЛрдЧ:
c# int hashCode = HashCode.Combine(field1).Combine(name, StringComparison.OrdinalIgnoreCase).Value; int hashCode = (int)HashCode.Combine(field1).Combine(field2);

рдмреАрдЬ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдкрд╣рд▓реЗ рд╕рдВрдпреЛрдЬрди рдХреЗ рдмрд╛рдж рдХрд╛ рдмреАрдЬ рдирд╣реАрдВ рд╣реИред

рдпрд╣ рдЕрдЧрд▓реЗ рдЧрдардмрдВрдзрди рдХреЗ рд▓рд┐рдП рдПрдХ рдмреАрдЬ рд╣реИ, рдЬреЛ рдПрдХ рдирдпрд╛ рдмреАрдЬ рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░реВрдк рд╕реЗ рдкрдврд╝рдиреЗ рдпреЛрдЧреНрдп int Value рдХреЗ рд╕рд╛рде рдХреЛрдИ рдЖрдкрддреНрддрд┐ рдпрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рдорд╕реНрдпрд╛?

рдХреНрдпреЛрдВ? int Value { get; } рдЕрдзрд┐рдХ рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рд░реЗрдЦрд╛рдВрдХрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣ рдЕрдЧрд▓реЗ рдЧрдардмрдВрдзрди рдХреЗ рд▓рд┐рдП рдПрдХ рдмреАрдЬ рд╣реИ, рдЬреЛ рдПрдХ рдирдпрд╛ рдмреАрдЬ рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИред

рдХреНрдпрд╛ рд╡рд╣ рдЕрдВрдХреБрд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛? ;)

@jamesqo рдореЗрд░реЗ рдЕрдиреБрднрд╡ рдореЗрдВ рдЬрдм рдЬрдЯрд┐рд▓ рдХреЛрдб рдЧреБрдгреЛрдВ рд╕реЗ рдШрд┐рд░рд╛ рд╣реЛрддрд╛ рд╣реИ рддреЛ рдлрд╝реАрд▓реНрдб рд╕реЗ рднреА рдмрджрддрд░ рдХреЛрдб рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ (рдЙрдирдореЗрдВ рд╕реЗ, рдЧреИрд░ рдЗрдирд▓рд╛рдЗрди)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдкрд░ рдПрдХ рдЗрдВрдЯ рдХрд╛ рдПрдХ рдкрдардиреАрдп рдХреНрд╖реЗрддреНрд░ рд╕реАрдзреЗ рдПрдХ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдВрддрддрдГ рдЬрдм рдЬреЗрдЖрдИрдЯреА рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд▓рд┐рдП рд░реАрдбреЛрдирд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ (рдЬрд┐рд╕реЗ рдХреЛрдб-рдЬреЗрди рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдЕрднреА рддрдХ рдЗрд╕рдХрд╛ рдХреЛрдИ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ); рдРрд╕реЗ рдЕрдиреБрдХреВрд▓рди рд╣реИрдВ рдЬрд┐рдирдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛ рд╕рдХрддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдпреЛрдЧреНрдп рд╣реИред рдЙрдкрдпреЛрдЧ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЧреЗрдЯрд░ рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рд╕рд╛рде рд╣реА рдпрд╣ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рднреА рдЖрдЧреЗ рдмрдврд╝рд╛рддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рд╕рдВрд░рдЪрдирд╛рдПрдБ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИрдВред

рдореЗрд░реЗ рдЕрдиреБрднрд╡ рдореЗрдВ рдЬрдм рдЬрдЯрд┐рд▓ рдХреЛрдб рдЧреБрдгреЛрдВ рд╕реЗ рдШрд┐рд░рд╛ рд╣реЛрддрд╛ рд╣реИ рддреЛ рдлрд╝реАрд▓реНрдб рд╕реЗ рднреА рдмрджрддрд░ рдХреЛрдб рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ (рдЙрдирдореЗрдВ рд╕реЗ, рдЧреИрд░ рдЗрдирд▓рд╛рдЗрди)ред

рдпрджрд┐ рдЖрдкрдХреЛ рдПрдХ рдПрдХрд▓ рдЧреИрд░-рдбреАрдмрдЧ рдмрд┐рд▓реНрдб рдорд┐рд▓рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдПрдХ рд╕реНрд╡рдд: рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рд╕рдВрдкрддреНрддрд┐ рд╣рдореЗрд╢рд╛ рд░реЗрдЦрд╛рдВрдХрд┐рдд рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рдЬреЗрдЖрдИрдЯреА рдореБрджреНрджрд╛ рд╣реИ рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рддрдп рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдкрд░ рдПрдХ рдЗрдВрдЯ рдХрд╛ рдПрдХ рдкрдардиреАрдп рдХреНрд╖реЗрддреНрд░ рд╕реАрдзреЗ рдПрдХ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИ

рдРрд╕реЗ рдЕрдиреБрдХреВрд▓рди рд╣реИрдВ рдЬрд┐рдирдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛ рд╕рдХрддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдпреЛрдЧреНрдп рд╣реИред

рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХреНрд╖реЗрддреНрд░ рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛; рдПрдкреАрдЖрдИ рдПрдХ рдПрдХреНрд╕реЗрд╕рд░ рд╣реЛрдЧрд╛ред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдХрд┐рд╕реА рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдпрд╣рд╛рдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛрдЧрд╛ред

@jamesqo рдореИрдВ рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рдвреВрдВрдвреВрдВрдЧрд╛ ред рдкреНрд░рджрд░реНрд╢рди рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдореИрдВ рдЕрдм рдЧреБрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ (рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдорд╛рдВрд╕рдкреЗрд╢реА рд╕реНрдореГрддрд┐)ред

рдЖрдк "рдмреАрдЬ" рдХреЗ рдмрдЬрд╛рдп рдиреЗрд╕реНрдЯреЗрдб рд╕рдВрд░рдЪрдирд╛ "рд░рд╛рдЬреНрдп" рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

@ellismg рдЬрд╝рд░реВрд░, рд╕реБрдЭрд╛рд╡ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рдЖрдВрддрд░рд┐рдХ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдЖрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдШрд░реНрд╖ рдХрд░ рд░рд╣рд╛ рдерд╛ред

@karelz рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдкреАрдЖрдИ рдЖрдЦрд┐рд░рдХрд╛рд░ рдЕрдЪреНрдЫреА рд╣реИ; рдЗрд╕ рдмрд╛рд░, рдореИрдВрдиреЗ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХреА рдХрд┐ рд╕рдм рдХреБрдЫ рд╕рдВрдХрд▓рд┐рдд рд╣реИред рдЬрдм рддрдХ рдХрд┐рд╕реА рдХреЛ рдХреЛрдИ рдЖрдкрддреНрддрд┐ рдирд╣реАрдВ рд╣реЛрдЧреА, рдореИрдВ рдЗрд╕рдХреЗ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрди рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреВрдВрдЧрд╛ред

@jamesqo @JonHanna рд╣рдо рдХреНрдпреЛрдВ рдХреА рдХреНрдпрд╛ рдЬрд╝рд░реВрд░рдд рд╣реИ Combine<T>(T obj) рдХреЗ рдмрдЬрд╛рдп Combine(object o) ?

рд╣рдореЗрдВ рдХрдВрдмрд╛рдЗрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ(рдЯреА рдУрдмреАрдЬреЗ) рдХрдВрдмрд╛рдЗрди (рдСрдмреНрдЬреЗрдХреНрдЯ рдУ) рдХреЗ рдмрдЬрд╛рдп?

рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдЖрд╡рдВрдЯрд┐рдд рдХрд░реЗрдЧрд╛ рдпрджрд┐ рдЙрджрд╛рд╣рд░рдг рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдерд╛ред

рджреБрд╣, рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рд╣рдореЗрдВ рдиреЗрд╕реНрдЯреЗрдб рдкреНрд░рдХрд╛рд░ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЛ рдЬрдЯрд┐рд▓ рдмрдирд╛рддрд╛ рд╣реИред рдореВрд▓ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рдереА рдХрд┐ рд╣рдо рд╕реНрдЯреИрдЯрд┐рдХреНрд╕ рдФрд░ рдиреЙрди-рд╕реНрдЯреИрдЯрд┐рдХреНрд╕ рдХреЛ рдПрдХ рд╣реА рдирд╛рдо рдирд╣реАрдВ рджреЗ рд╕рдХрддреЗред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ: рд╕реНрдЯреИрдЯрд┐рдХреНрд╕ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдПрдВ рдпрд╛ рдирд╛рдо рдмрджрд▓реЗрдВред рд╣рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ Create рдирд╛рдо рдмрджрд▓рдиреЗ рд╕реЗ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╛рдлреА рдкрдардиреАрдп рдХреЛрдб рдмрдирд╛рддрд╛ рд╣реИред

рдЬрдм рддрдХ рдХреЛрдИ рдордЬрдмреВрдд рд╡рд┐рд░реЛрдз рди рд╣реЛ, рдпрд╣реА рд╡рд╣ рдбрд┐рдЬрд╛рдЗрди рд╣реИ рдЬрд┐рд╕ рдкрд░ рд╣рдордиреЗ рд╕рдордЭреМрддрд╛ рдХрд┐рдпрд╛ рд╣реИ:

```рд╕реА#
рдиреЗрдорд╕реНрдкреЗрд╕ рд╕рд┐рд╕реНрдЯрдо
{
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕рдВрд░рдЪрдирд╛ рд╣реИрд╢рдХреЛрдб: IEquatable
{
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдереИрддрд┐рдХ рд╣реИрд╢рдХреЛрдб рдмрдирд╛рдПрдВ (int рд╣реИрд╢рдХреЛрдб);
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдереИрддрд┐рдХ рд╣реИрд╢рдХреЛрдб рдмрдирд╛рдПрдБ(рдЯреА рдУрдмреАрдЬреЗ);
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдереИрддрд┐рдХ рд╣реИрд╢рдХреЛрдб рдмрдирд╛рдПрдБ(рдЯреА рдУрдмреАрдЬреЗ, рдЖрдИрдИрдХреНрд╡рд╛рд▓рд┐рдЯреА рдХрдВрдкреЗрдпрд░рд░рддреБрд▓рдирд╛рдХрд░реНрддрд╛);

    public HashCode Combine(int hashCode);
    public HashCode Combine<T>(T obj);
    public HashCode Combine<T>(T obj, IEqualityComparer<T> comparer);

    public int Value { get; }

    public static implicit operator int(HashCode hashCode);

    public static bool operator ==(HashCode left, HashCode right);
    public static bool operator !=(HashCode left, HashCode right);

    public bool Equals(HashCode other);
    public override bool Equals(object obj);
    public override int GetHashCode();
}

}
```

рдЖрдЗрдП рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рджрд┐рдиреЛрдВ рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдХрд┐ рд╕реНрд╡реАрдХреГрдд рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рдХреЛрдИ рдордЬрдмреВрдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рддрдм рд╣рдо рдЗрд╕реЗ 'рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП' рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╣ рдбрд┐рдЬрд╛рдЗрди рдХреЛ рдЬрдЯрд┐рд▓ рдХреНрдпреЛрдВ рдХрд░рддрд╛ рд╣реИ? рдореИрдВ рд╕рдордЭ рд╕рдХрддрд╛ рдерд╛ рдХрд┐ рдпрд╣ рдХрд┐рддрдирд╛ рдмреБрд░рд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдб рдореЗрдВ рд╣реИрд╢рдХреЛрдб.рд╕реНрдЯреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрдбрд╝реЗ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЪрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣рдо рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЕрдХреНрд╕рд░ рдРрд╕рд╛ рд╣реА рд╣реЛрддрд╛ рд╣реИ? рдЬреНрдпрд╛рджрд╛рддрд░ рдмрд╛рд░ рдореИрдВ рдпрд╛ рддреЛ рдореВрд▓реНрдп рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╡рд╛рдкрд╕ рдХрд░ рджреВрдВрдЧрд╛ рдпрд╛ рдПрдХ int рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░ рджреВрдВрдЧрд╛ рдФрд░ рдЙрд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рджреВрдВрдЧрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрдирд╛рдПрдВ рдФрд░ рдХрдореНрдмрд╛рдЗрди рдХрд╛ рд╕рдВрдпреЛрдЬрди рдмрджрддрд░ рд╣реИред

рдХреГрдкрдпрд╛ рджреЗрдЦреЗрдВ https://github.com/dotnet/corefx/issues/8034#issuecomment -262661653

@terrajobst

рд╣рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреНрд░рд┐рдПрдЯ рдХрд╛ рдирд╛рдо рдмрджрд▓рдиреЗ рд╕реЗ рд╕рдмрд╕реЗ рдЬреНрдпрд╛рджрд╛ рдлрд╛рдпрджрд╛ рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдбрд┐рдлреЙрд▓реНрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╛рдлреА рдкрдардиреАрдп рдХреЛрдб рдмрдирд╛рддрд╛ рд╣реИред

рдЬрдм рддрдХ рдХреЛрдИ рдордЬрдмреВрдд рд╡рд┐рд░реЛрдз рди рд╣реЛ, рдпрд╣реА рд╡рд╣ рдбрд┐рдЬрд╛рдЗрди рд╣реИ рдЬрд┐рд╕ рдкрд░ рд╣рдордиреЗ рд╕рдордЭреМрддрд╛ рдХрд┐рдпрд╛ рд╣реИ:

рдореИрдВ рддреБрдореНрд╣реЗрдВ рд╕реБрдирддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдПрдХ рдЖрдЦрд┐рд░реА рдорд┐рдирдЯ рдореЗрдВ рд╕реЛрдЪрд╛ рдЬрдм рдореИрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛ рдерд╛ ... рд╣рдо рдмрд╕ рдПрдХ рд╕реНрдерд┐рд░ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ Zero / Empty рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдкрддреНрддрд┐ HashCode , рдФрд░ рдлрд┐рд░ рдХреНрдпрд╛ рд▓реЛрдЧ рд╡рд╣рд╛рдВ рд╕реЗ Combine рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ? рдпрд╣ рд╣рдореЗрдВ рдЕрд▓рдЧ Combine / Create рд╡рд┐рдзрд┐рдпреЛрдВ рд╕реЗ рдореБрдХреНрдд рдХрд░реЗрдЧрд╛ред

namespace System
{
    public struct HashCode : IEquatable<HashCode>
    {
        public static HashCode Empty { get; }

        public HashCode Combine(int hashCode);
        public HashCode Combine<T>(T obj);
        public HashCode Combine<T>(T obj, IEqualityComparer<T> comparer);

        public int Value { get; }

        public static implicit operator int(HashCode hashCode);

        public static bool operator ==(HashCode left, HashCode right);
        public static bool operator !=(HashCode left, HashCode right);

        public bool Equals(HashCode other);
        public override bool Equals(object obj);
        public override int GetHashCode();
    }
}

int GetHashCode()
{
    return HashCode.Empty
        .Combine(_1)
        .Combine(_2);
}

рдХрд┐рд╕реА рдФрд░ рдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ? (рдореИрдВ рдЗрд╕ рдмреАрдЪ рдПрдХ рдкреАрдЖрд░ рдЬрдорд╛ рдХрд░реВрдВрдЧрд╛, рдФрд░ рдЕрдЧрд░ рд▓реЛрдЧ рдРрд╕рд╛ рд╕реЛрдЪрддреЗ рд╣реИрдВ рддреЛ рдореИрдВ рдЗрд╕реЗ рдкреАрдЖрд░ рдореЗрдВ рдмрджрд▓ рджреВрдВрдЧрд╛ред)

@jamesqo , рдореБрдЭреЗ рдЦрд╛рд▓реА/рд╢реВрдиреНрдп рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ (рдХреЗ рдмреАрдЪ рдХреЛрдИ рдордЬрдмреВрдд рд╡рд░реАрдпрддрд╛ рдХреЗ рд╕рд╛рде рдареАрдХ рд╣реЛрдЧрд╛ Empty рдмрдирд╛рдо Create ... @weshaggard @bartonjs @stephentoub @terrajobst рдХреНрдпрд╛ рддреБрдо рд▓реЛрдЧ рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд╛рд░рдЦрд╛рдирд╛)?

рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрдирд╛рдПрдВ() рдмреЗрд╣рддрд░ рд╣реИ; рд▓реЗрдХрд┐рди рдореБрдЭреЗ HashCode.Empty new HashCode() рд╕реЗ рдмреЗрд╣рддрд░ рдкрд╕рдВрдж рд╣реИред

рдЪреВрдВрдХрд┐ рдпрд╣ рдПрдХ рдРрд╕реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреЛрдИ рдСрдкрд░реЗрдЯрд░-рдирдпрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрд╣ рдмрд╛рдж рдореЗрдВ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмреВрдЯрд╕реНрдЯреНрд░реИрдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ ... :: рд╢реНрд░рдЧ ::ред

рдпрд╣ рдореЗрд░реЗ рдкреБрд╢рдмреИрдХ рдХреА рдкреВрд░реА рд╕реАрдорд╛ рд╣реИ (рдЙрд░реНрдл рдмрд╣реБрдд рдЬреНрдпрд╛рджрд╛ рдирд╣реАрдВ)ред

FWIW рдореИрдВ Empty / Zero рдмрдЬрд╛рдп Create рд▓рд┐рдП рд╡реЛрдЯ рдХрд░реВрдВрдЧрд╛ред рдореИрдВ Empty / Zero рд╕реЗ рд╕рдм рдХреБрдЫ рд▓рдЯрдХрд╛ рджреЗрдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдпрд╣ рд╕рд┐рд░реНрдл рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИ / рд▓рдЧрддрд╛ рд╣реИред

рдпрд╣ рд╢реВрдиреНрдп рдХреЗ рд╕рд╛рде рд╕реАрдбрд┐рдВрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЛ рднреА рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рдЧрд░реАрдм рдмреАрдЬ рд╣реЛрддрд╛ рд╣реИред

рдореИрдВ рдЦрд╛рд▓реА рдХреЗ рдмрдЬрд╛рдп рдмрдирд╛рдПрдБ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдБред рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ рд╕реЛрдЪрддрд╛ рд╣реВрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдпрд╣ рдЬреАрд╡рдВрдд рд╣реИ: рдореИрдВ рд╣реИрд╢ рдХреЛрдб рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдореВрд▓реНрдпреЛрдВ рдореЗрдВ рдорд┐рд╢реНрд░рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореИрдВ рдиреЗрд╕реНрдЯреЗрдб рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рднреА рдареАрдХ рд╣реЛ рдЬрд╛рдКрдВрдЧрд╛ред

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

@ рдЬреЛрдирд╣рдиреНрдирд╛ рд╕рд┐рд░реНрдл рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП: рдЖрдкрдХрд╛ рдорддрд▓рдм Create рд▓рд┐рдП рд╡реЛрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдерд╛, рд╣реИ рдирд╛?

рдФрд░ рдЪреМрдереЗ рдкрд░ рд╕реЛрдЪрд╛ рдХрд┐ рдХреИрд╕реЗ рдмрдирд╛рдПрдВ рдХреЗ рдмрдЬрд╛рдп рд╕рд╛рде рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред

рд╣реИрд╢рдХреЛрдбред (рдП) рдХреЗ рд╕рд╛рдеред рдЧрдардмрдВрдзрди (рдмреА)ред рдЧрдардмрдВрдзрди (рд╕реА)

рдирд╡реАрдирддрдо рдЪрд░реНрдЪрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЙрджрд╛рд╣рд░рдг рдЙрдкрдпреЛрдЧ ( Create рд╕рдВрднрд╡рддрдГ w/рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдирд╛рдо рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ):

```рд╕реА#
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдУрд╡рд░рд░рд╛рдЗрдб int GetHashCode () =>
рд╣реИрд╢рдХреЛрдбред рдХреНрд░рд┐рдПрдЯ (_рдлреАрд▓реНрдб 1)ред рдХреЙрдореНрдмрд╛рдЗрди (_рдлреАрд▓реНрдб 2)ред рдХреЙрдореНрдмрд┐рдиреЗрд╢рди (_рдлреАрд▓реНрдб 3);

We went down the path of this chaining approach, but didn't reconsider earlier proposals when the static & instance `Combine` methods didn't pan out...

Are we sure we don't want something like the existing `Path.Combine` pattern, that was proposed previously, with a handful of generic `Combine` overloads? e.g.:

```c#
public override int GetHashCode() =>
    HashCode.Combine(_field1, _field2, _field3);

@justinvp рдЕрд╕рдВрдЧрдд рдХреЛрдб рдХреА рдУрд░ рд▓реЗ рдЬрд╛рдПрдЧрд╛ + рдЕрдзрд┐рдХ рдЭрдЯрдХреЗрджрд╛рд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреЗ рдмреА/рд╕реАред рдЕрдЧрд░ рдпрд╣ рд╡рд╛рдВрдЫрдиреАрдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рд╣рдо рдЗрд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдореБрджреНрджреЗ рдкрд░ рдлрд┐рд░ рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

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

рдореИрдВ рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрд╕рд╛рдорд╛рдиреНрдп рд╣реИ рдФрд░ рдореБрдЭреЗ рдЕрднреА рднреА рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕рд╛ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдПрдХ рдФрд░ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕рднреА рд╡рд┐рдХрд▓реНрдкреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ...

рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдордиреЗ ASP.NET рдХреЛрд░ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ HashCodeCombiner "рдмрд┐рд▓реНрдбрд░" рдХреА рддрд░реНрдЬ рдкрд░ рдХреБрдЫ рдХрд┐рдпрд╛, рд╕рдорд╛рди Add рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде, рд▓реЗрдХрд┐рди рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рд╛рд░рдВрднрдХрд░реНрддрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рднреА рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛?

рдЙрдкрдпреЛрдЧ:

```рд╕реА#
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдУрд╡рд░рд░рд╛рдЗрдб int GetHashCode () =>
рдирдпрд╛ рд╣реИрд╢рдХреЛрдб { _field1, _field2, _field3};

With a surface area something like:

```c#
namespace System
{
    public struct HashCode : IEquatable<HashCode>, IEnumerable
    {
        public void Add(int hashCode);
        public void Add<T>(T obj);
        public void Add<T>(T obj, IEqualityComparer<T> comparer);

        public int Value { get; }

        public static implicit operator int(HashCode hashCode);

        public static bool operator ==(HashCode left, HashCode right);
        public static bool operator !=(HashCode left, HashCode right);

        public bool Equals(HashCode other);
        public override bool Equals(object obj);
        public override int GetHashCode();

        IEnumerator IEnumerable.GetEnumerator();
    }
}

рдЗрд╕реЗ рдХрдо рд╕реЗ рдХрдо IEnumerable рдХреЗ рд╕рд╛рде рдХрдо рд╕реЗ рдХрдо рдПрдХ Add рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рд╛рд░рдВрднрдХрд░реНрддрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред IEnumerable рдХреЛ рдЗрдВрдЯреЗрд▓рд┐рдЬреЗрдВрд╕ рд╕реЗ рдЫрд┐рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ GetEnumerator рдпрд╛ рддреЛ NotSupportedException рдлреЗрдВрдХ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рд╣реИрд╢ рдХреЛрдб рдорд╛рди рдХреЛ рдЧрдгрдирд╛ рдореЗрдВ рдПрдХ рд╕рдВрдпреБрдХреНрдд рдЖрдЗрдЯрдо рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЕрдЧрд░ рдХреЛрдИ рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ (рдЬреЛ рджреБрд░реНрд▓рдн рд╣реЛрдЧрд╛)ред

@justinvp , рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рдЪрд╛рд░ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореИрдВ рд╕рдореНрдорд╛рдирдкреВрд░реНрд╡рдХ рдЕрд╕рд╣рдордд рд╣реВрдБ; рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ HashCode рдХреЛ рдореНрдпреВрдЯреЗрдмрд▓ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрд╕ рдХреЗ рд╕рд╛рде рдЧреЛрдЪрд░реНрд╕ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рд▓рд┐рдП IEnumerable рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рднреА рдХреГрддреНрд░рд┐рдо/рдкрд░рддрджрд╛рд░ рд▓рдЧрддрд╛ рд╣реИ; рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ using System.Linq рдирд┐рд░реНрджреЗрд╢ рд╣реИ, рддреЛ Cast<> рдФрд░ OfType<> рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗ рдпрджрд┐ рд╡реЗ HashCode рдмрдЧрд▓ рдореЗрдВ рдПрдХ рдмрд┐рдВрджреБ рдбрд╛рд▓рддреЗ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдореМрдЬреВрджрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдХрд░реАрдм рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдПред

@jamesqo , рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ - рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдореЗрдВ рднреА рдореЗрд░реА рдЭрд┐рдЭрдХ рд╣реИред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рдореБрдЭреЗ рдкрд╕рдВрдж рд╣реИ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧ рдЪреЗрдирд┐рдВрдЧ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреНрд▓реАрдирд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реНрд╡рдпрдВ рдПрдХ рдФрд░ рдХрдореА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдирдореВрдирд╛ рдЙрдкрдпреЛрдЧ рдХреЛ рджреЗрдЦреЗ рдмрд┐рдирд╛ рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рд╛рд░рдВрднрдХрд░реНрддрд╛рдУрдВ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

@MadsTorgersen , @jaredpar , рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рд╛рд░рдВрднрдХрд░реНрддрд╛ рдХреЛ IEnumerable\ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ@justinvp рдХреА рддреАрд╕рд░реА рдЯрд┐рдкреНрдкрдгреА рдКрдкрд░ред

@jamesqo , рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕реЗ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд░рдЦрдирд╛ рдмреЗрд╣рддрд░ рд╣реИ (рдФрд░ IEnumerable рдирд╣реАрдВ \

@ рдореЗрд▓рд┐рдиреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рд╛рдзрд╛рд░рдг рдорд╛рдорд▓реЗ рдХреЛ рдереЛрдбрд╝рд╛ рдЖрд╕рд╛рди рдмрдирд╛ рджреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЙрд╕рд╕реЗ рднреА рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ (рдФрд░ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╕рд╣реА рд╣реИ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрдо рд╕реНрдкрд╖реНрдЯ) рд╕реЗ рдкрд░реЗ рдХреБрдЫ рднреА рдмрдирд╛ рджреЗрдЧрд╛ред

рдЬрд┐рд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ:

  1. рдЖрдкрдХреЗ рдкрд╛рд╕ рдУрд╡рд░рд▓реЛрдб рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдЖрдЗрдЯрдо
  2. рд╢рд░реНрддреЗрдБ
  3. рдЫреЛрд░реЛрдВ
  4. рддреБрд▓рдирд╛рдХрд░реНрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдкрд╣рд▓реЗ рдкреЛрд╕реНрдЯ рдХрд┐рдП рдЧрдП ASP.NET рдХреЗ рдХреЛрдб рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ (рд╡рд░реНрддрдорд╛рди рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдЕрджреНрдпрддрди):

```рд╕реА#
рд╡рд░ рд╣реИрд╢рдХреЛрдб = рд╣реИрд╢рдХреЛрдб
.рдХреНрд░рд┐рдПрдЯ (IsMainPage)
.Combine(ViewName, StringComparer.Ordinal)
.Combine(ControllerName, StringComparer.Ordinal)
.Combine(AreaName, StringComparer.Ordinal);

рдЕрдЧрд░ (ViewLocationExpanderValues!= null)
{
foreach (ViewLocationExpanderValues тАЛтАЛтАЛтАЛрдореЗрдВ var рдЖрдЗрдЯрдо)
{
рд╣реИрд╢рдХреЛрдб = рд╣реИрд╢рдХреЛрдб
.Combine(item.Key, StringComparer.Ordinal)
.Combine(item.Value, StringComparer.Ordinal);
}
}

рд╡рд╛рдкрд╕реА рд╣реИрд╢рдХреЛрдб;

How would this look with the original `Hash.CombineHashCodes`? I think it would be:

```c#
var hashCode = Hash.CombineHashCodes(
    IsMainPage,
    StringComparer.Ordinal.GetHashCode(ViewName),
    StringComparer.Ordinal.GetHashCode(ControllerName),
    StringComparer.Ordinal.GetHashCode(AreaName));

if (ViewLocationExpanderValues != null)
{
    foreach (var item in ViewLocationExpanderValues)
    {
        hashCode = Hash.CombineHashCodes(
            hashCode
            StringComparer.Ordinal.GetHashCode(item.Key),
            StringComparer.Ordinal.GetHashCode(item.Value));
    }
}

return hashCode;

рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЕрдЧрд░ рдЖрдк рдХрд╕реНрдЯрдо рддреБрд▓рдирд╛рдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП GetHashCode() рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЙрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ hashCode рдХрд╛ рдкрд┐рдЫрд▓рд╛ рдорд╛рди рд╕реАрдзрд╛ рдирд╣реАрдВ рд╣реИред

@KrzysztofCwalina @ericlippert рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХреА рдореЗрдВ рд╕реА # рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдЯрд┐рдкреНрдкрдгреА 1, рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрдЧреНрд░рд╣ initializers рд╣реИрдВ (рдЖрд╢реНрдЪрд░реНрдп) рд╕рдВрдЧреНрд░рд╣ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдЪреАрдиреА, рдЧрдгрд┐рдд рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ (рдЬреЛ рдирд╛рдорд┐рдд рд╡рд┐рдзрд┐ рдХреЗ рдЕрдиреНрдп рдЖрдо рдЙрдкрдпреЛрдЧ рдерд╛ рдорддрд▓рдм рд╣реИ Add )ред

1 Google рдкреБрд╕реНрддрдХреЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИрдВ, рдЗрд╕рдХреЗ рдХрд╛рд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рд▓рд┐рдВрдХ рд╕рднреА рдХреЗ рд▓рд┐рдП рдХрд╛рдо рди рдХрд░реЗред

@KrzysztofCwalina , рдФрд░ рдзреНрдпрд╛рди рджреЗрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЧреИрд░-рдЬреЗрдиреЗрд░рд┐рдХ IEnumerable , рди рдХрд┐ IEnumerable<T> ред

@svick, рдКрдкрд░ рдЕрдкрдиреЗ рдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдорд╛рдореВрд▓реА рдирд┐рдЯ: рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реА рдХреЙрд▓ .Combine рд╣реЛрдЧрд╛ .Create рд╡рд░реНрддрдорд╛рди рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рдеред рдЬрдм рддрдХ рд╣рдо рдиреЗрд╕реНрдЯреЗрдб рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗред

@svick

рдпрд╣ рдЗрд╕рд╕реЗ рдкрд░реЗ рдХреБрдЫ рднреА рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдмрдирд╛ рджреЗрдЧрд╛ (рдФрд░ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╕рд╣реА рд╣реИ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрдо рд╕реНрдкрд╖реНрдЯ)

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

@justinvp рдзрдиреНрдпрд╡рд╛рдж, рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ред (рдореИрдВ рдкрд╣рд▓реА рдкреЛрд╕реНрдЯ рдореЗрдВ рдкрд╣рд▓реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рдЧрдпрд╛ рдерд╛, рдФрд░ рдпрд╣ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ рдпрд╣ рдкреБрд░рд╛рдирд╛ рд╣реИ, рдХрд┐рд╕реА рдХреЛ рд╢рд╛рдпрдж рдЗрд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред)

@ рдореЗрд▓рд┐рдиреЛ рд╕рдорд╕реНрдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рд╣реИ рдХрд┐ рджреВрд╕рд░рд╛ рд╕реВрдХреНрд╖реНрдо рдмрдЧ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рд╣реИред

        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public int GetHashCode(PageFromScratchBuffer obj)
        {
            int v = Hashing.Combine(obj.NumberOfPages, obj.ScratchFileNumber);
            int w = Hashing.Combine(obj.Size.GetHashCode(), obj.PositionInScratchBuffer.GetHashCode());
            return Hashing.Combine(v, w);            
        }

рд╣рдо рдЗрд╕рдХреЗ рд╕рд╛рде рд░рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рд╣рд░ рджрд┐рди рдмрд╣реБрдд рдирд┐рдореНрди рд╕реНрддрд░ рдХреА рдЪреАрдЬреЛрдВ рд╕реЗ рдирд┐рдкрдЯ рд░рд╣реЗ рд╣реИрдВ; рддреЛ рдФрд╕рдд рдбреЗрд╡рд▓рдкрд░ рдирд╣реАрдВ рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣рд╛рдБ v рдХреЛ w рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИ, v рдХреЗ рд╕рд╛рде w ... рдХреЛ v рдФрд░ w рдХреЗ рдмреАрдЪ рдореЗрдВ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣реИрд╢ рд╕рдВрдпреЛрдЬрди рдХрдореНрдпреВрдЯрд┐рд╡ рдирд╣реАрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдПрдХ рдХреЗ рдмрд╛рдж рдПрдХ рдЪреЗрдирд┐рдВрдЧ рдХрд░рдиреЗ рд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдкреАрдЖрдИ рд╕реНрддрд░ рдкрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдкреВрд░реЗ рд╕реЗрдЯ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИред

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

рдХрд┐рдпрд╛ рд╣реБрдЖред
BTW: рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рдирдЬрд╝рд░ рд░рдЦрдирд╛ рдмрд╣реБрдд рдХрдард┐рди рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡реЛрдЯ ... рдЗрддрдиреЗ рд╕рд╛рд░реЗ рдмрджрд▓рд╛рд╡ (рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЪреНрдЫрд╛ рд╣реИ ;-))

@karelz рдЕрдЧрд░ рд╣рдо Create рдПрдкреАрдЖрдИ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЕрднреА рднреА Empty рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рдпрд╛ рджреВрд╕рд░реЗ рд╣реЛрдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ @bartonjs рдиреЗ рдХрд╣рд╛ рдерд╛ред рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд

namespace System
{
    public struct HashCode : IEquatable<HashCode>
    {
        public HashCode();

        public static HashCode Empty { get; }

        public static HashCode Create(int hashCode);
        public static HashCode Create<T>(T value);
        public static HashCode Create<T>(T value, IEqualityComparer<T> comparer);

        public HashCode Combine(int hashCode);
        public HashCode Combine<T>(T value);
        public HashCode Combine<T>(T value, IEqualityComparer<T> comparer);

        public int Value { get; }

        public static implicit operator int(HashCode hashCode);

        public static bool operator ==(HashCode left, HashCode right);
        public static bool operator !=(HashCode left, HashCode right);

        public bool Equals(HashCode other);
        public override bool Equals(object obj);
        public override int GetHashCode();
        public override string ToString();
    }
}

@JonHanna

рдпрд╣ рд╢реВрдиреНрдп рдХреЗ рд╕рд╛рде рд╕реАрдбрд┐рдВрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЛ рднреА рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рдЧрд░реАрдм рдмреАрдЬ рд╣реЛрддрд╛ рд╣реИред

рд╣рдо рдЬреЛ рд╣реИрд╢рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдЪреБрди рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рд╡рд╣реА рд╣реЛрдЧрд╛ рдЬреЛ рдЖрдЬ HashHelpers рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдкреНрд░рднрд╛рд╡ hash(0, x) == x ред HashCode.Empty.Combine(x) рдареАрдХ рдЙрд╕реА рддрд░рд╣ рдХреЗ рдкрд░рд┐рдгрд╛рдо рджреЗрдЧрд╛ рдЬреИрд╕реЗ HashCode.Create(x) , рдЗрд╕рд▓рд┐рдП рд╡рд╕реНрддреБрдирд┐рд╖реНрда рд░реВрдк рд╕реЗ рдХреЛрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИред

@jamesqo рдЖрдк рдЕрдкрдиреЗ рдкрд┐рдЫрд▓реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд Zero рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рднреВрд▓ рдЧрдПред рдЕрдЧрд░ рд╡рд╣ рдПрдХ рдЪреВрдХ рдереА, рддреЛ рдХреНрдпрд╛ рдЖрдк рдЗрд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдлрд┐рд░ рд╣рдо рд▓реЛрдЧреЛрдВ рд╕реЗ рдЖрдкрдХреЗ рдирд╡реАрдирддрдо рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓рд┐рдП рд╡реЛрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ (рд╢реАрд░реНрд╖ рдкреЛрд╕реНрдЯ рджреЗрдЦреЗрдВ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рд╣реИ) рдЗрддрдирд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ ...

@karelz рд╕реНрдкреЙрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рддрдпред

@KrzysztofCwalina рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдЕрд░реНрде рдореЗрдВ рдЖрдкрдХрд╛ рдорддрд▓рдм "рдЬреЛрдбрд╝реЗрдВ" рд╣реИ, рдХрд┐рд╕реА рдЕрдиреНрдп рдЕрд░реНрде рдореЗрдВ рдирд╣реАрдВред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдореБрдЭреЗ рдпрд╣ рдкреНрд░рддрд┐рдмрдВрдз рдкрд╕рдВрдж рд╣реИ рдпрд╛ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рд╣рдордиреЗ рдЙрд╕ рд╕рдордп рдпрд╣реА рддрдп рдХрд┐рдпрд╛ рдерд╛ред

public static HashCode Create(int hash);
public HashCode Combine(int hash);

рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдирд╛рдо hashCode рдХреЗ рдмрдЬрд╛рдп hash рдХреЗ рдмрд╛рдж рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд░ рджрд┐рдпрд╛-рдореЗрдВ рдореВрд▓реНрдп рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдмреБрд▓рд╛ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдПрдХ рд╣реИрд╢ рдХреЛрдб рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИ GetHashCode() ?

Empty / Zero

рдЕрдЧрд░ рд╣рдо рдЗрд╕реЗ рдмрдирд╛рдП рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдирд╛рдо Default ред

@justinvp

рдХреНрдпрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╣реИрд╢ рдХреЗ рдмрдЬрд╛рдп рд╣реИрд╢рдХреЛрдб рдирд╛рдо рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдкрд╛рд╕-рдЗрди рдорд╛рди GetHashCode() рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рд╣реИрд╢ рдХреЛрдб рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИ?

рдореИрдВ int рдкреИрд░рд╛рдореАрдЯрд░ hash рдФрд░ HashCode рдкреИрд░рд╛рдореАрдЯрд░ hashCode рдирд╛рдо рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рджреВрд╕рд░реЗ рд╡рд┐рдЪрд╛рд░ рдкрд░, рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ hashCode рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, hash рдереЛрдбрд╝реЗ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИред рдореИрдВ рдПрдкреАрдЖрдИ рдЕрдкрдбреЗрдЯ рдХрд░реВрдВрдЧрд╛ред

рдпрджрд┐ рд╣рдо рдЗрд╕реЗ рдмрдирд╛рдП рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдирд╛рдо рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИред

рдЬрдм рдореИрдВ Default рд╕реБрдирддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ "рдХреБрдЫ рдХрд░рдиреЗ рдХрд╛ рдирд┐рдпрдорд┐рдд рддрд░реАрдХрд╛ рдЬрдм рдЖрдк рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдХреМрди рд╕рд╛ рд╡рд┐рдХрд▓реНрдк рдЪреБрдирдирд╛ рд╣реИ," рдирд╣реАрдВ "рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдиред" рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП Encoding.Default рдЬреИрд╕рд╛ рдХреБрдЫ рдмрд┐рд▓реНрдХреБрд▓ рдЕрд▓рдЧ рдЕрд░реНрде рд╣реИред

рд╣рдо рдЬреЛ рд╣реИрд╢рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдЪреБрди рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рд╡рд╣реА рд╣реЛрдЧрд╛ рдЬреЛ рдЖрдЬ рд╣реИрд╢ рд╣реЗрд▓реНрдкрд░реНрд╕ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдкреНрд░рднрд╛рд╡ рд╣реИрд╢ (0, x) == x рд╣реИред HashCode.Empty.Combine(x) рдареАрдХ рдЙрд╕реА рддрд░рд╣ рдХреЗ рдкрд░рд┐рдгрд╛рдо рджреЗрдЧрд╛ рдЬреИрд╕реЗ HashCode.Create(x), рдЗрд╕рд▓рд┐рдП рдЗрд╕рдореЗрдВ рдХреЛрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИред

рдХрд┐рд╕реА рдРрд╕реЗ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛ рдЗрд╕рдХреЗ рдЖрдВрддрд░рд┐рдХ рднрд╛рдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИ, рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ HashCode.Create(x).Combine(...) рдХреА рд╕рд╛рджрдЧреА рдкрд╕рдВрдж рд╣реИред Create рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдИ рдЕрдиреНрдп рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрджрд┐ Empty / Zero / Default рдХреЛрдИ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдЙрдкрдпреЛрдЧ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЖрдИрдПрдордУ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдкреАрдПрд╕: рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рдзрд╛рдЧрд╛ !! рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛! рдореИрдВ

@cwe1ss

рдпрджрд┐ рдЦрд╛рд▓реА/рд╢реВрдиреНрдп/рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЛрдИ рдПрд▓реНрдЧреЛрд░рд┐рджрдорд┐рдХ рдЙрдкрдпреЛрдЧ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЖрдИрдПрдордУ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

Empty рдлрд╝реАрд▓реНрдб рд╣реЛрдиреЗ рд╕реЗ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдЙрдкрдпреЛрдЧ рдорд┐рд▓рддрд╛ рд╣реИред рдпрд╣ рдПрдХ "рд╢реБрд░реБрдЖрддреА рдореВрд▓реНрдп" рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдЖрдк рд╣реИрд╢ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк Create рдХрд╛ рд╕рдЦреНрддреА рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣реИрд╢ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдмрд╣реБрдд рджрд░реНрджрдирд╛рдХ рд╣реИ:

int CombineRange(int[] hashes)
{
    if (hashes.Length == 0)
    {
        return 0;
    }

    var result = HashCode.Create(hashes[0]);

    for (int i = 1; i < hashes.Length; i++)
    {
        result = result.Combine(hashes[i]);
    }

    return result;
}

рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ Empty , рддреЛ рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ:

int CombineRange(int[] hashes)
{
    var result = HashCode.Empty;

    for (int i = 0; i < hashes.Length; i++)
    {
        result = result.Combine(hashes[i]);
    }

    return result;
}

// or

int CombineRange(int[] hashes)
{
    return hashes.Aggregate(HashCode.Empty, (hc, next) => hc.Combine(next));
}

@terrajobst рдпрд╣ рдкреНрд░рдХрд╛рд░ рдореЗрд░реЗ рд▓рд┐рдП ImmutableArray<T> рдХреЗ рд╕рдорд╛рди рд╣реИред рдПрдХ рдЦрд╛рд▓реА рд╕рд░рдгреА рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП "рд╢реБрд░реБрдЖрддреА рдмрд┐рдВрджреБ" рдХреЗ рд░реВрдк рдореЗрдВ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП Empty рд╕рдВрдкрддреНрддрд┐ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ HashCode рд▓рд┐рдП рднреА рдПрдХ рд╣реЛрдирд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ; рд╣рдо Create рд░рдЦ рд░рд╣реЗ рд╣реИрдВред

@jamesqo рдореИрдВрдиреЗ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдЕрдкрдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡ https://github.com/dotnet/corefx/issues/8034#issuecomment -262661653 рдореЗрдВ рдЪреБрдкрдЪрд╛рдк/рджреБрд░реНрдШрдЯрдирд╛ рд╕реЗ рддрд░реНрдХ рдирд╛рдо obj рд╕реЗ value рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕реЗ рд╡рд╛рдкрд╕ obj рд╕реНрд╡рд┐рдЪ рдХрд░ рджрд┐рдпрд╛, рдЬреЛ IMO рдЖрдкрдХреЛ рдЬреЛ рдорд┐рд▓рддрд╛ рд╣реИ рдЙрд╕реЗ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдХреИрдкреНрдЪрд░ рдХрд░рддрд╛ рд╣реИред рдирд╛рдо value рдЗрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ "int" рд╣реИрд╢ рдорд╛рди рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред
рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдореИрдВ рддрд░реНрдХ рдирд╛рдо рдкрд░ рдЖрдЧреЗ рдХреА рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЖрдЗрдП рдЗрд╕реЗ рдЙрджреНрджреЗрд╢реНрдп рдкрд░ рдмрджрд▓реЗрдВ рдФрд░ рдкрд┐рдЫрд▓реЗ рд╕реНрд╡реАрдХреГрдд рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдЕрдВрддрд░ рдХрд╛ рдЯреНрд░реИрдХ рд░рдЦреЗрдВред

рдореИрдВрдиреЗ рд╢реАрд░реНрд╖ рдкрд░ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдЕрджреНрдпрддрди рдХрд┐рдпрд╛ рд╣реИред рдореИрдВрдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдЕрдВрддрд┐рдо рд╕реНрд╡реАрдХреГрдд рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдЦрд┐рд▓рд╛рдл рдЕрдВрддрд░ рдХрд╛ рднреА рдЖрд╣реНрд╡рд╛рди рдХрд┐рдпрд╛ред

рд╣рдо рдЬреЛ рд╣реИрд╢рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдЪреБрди рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рд╡рд╣реА рд╣реЛрдЧрд╛ рдЬреЛ рдЖрдЬ рд╣реИрд╢ рд╣реЗрд▓реНрдкрд░реНрд╕ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

рдЗрд╕реЗ рд╣рд░ рдЬрдЧрд╣ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреНрдпреЛрдВ рд╣реИ? рд╣реИрд╢рдХреЛрдб рдХреЗ рд╕рдВрдпреБрдХреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣ рдХреНрдпрд╛ рдзрд╛рд░рдгрд╛ рдмрдирд╛рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИ? рдпрджрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рд░ рдЬрдЧрд╣ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХреНрдпрд╛ рдпрд╣ DDoS рд╣рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдирдП рд░рд╛рд╕реНрддреЗ рдЦреЛрд▓рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ? (рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо рдЕрддреАрдд рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИрд╢рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЗрд╕рд╕реЗ рдЬрд▓ рдЪреБрдХреЗ рд╣реИрдВред)

рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдордиреЗ ASP.NET Core рдХреЗ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ HashCodeCombiner "рдмрд┐рд▓реНрдбрд░" рдХреА рддрд░реНрдЬ рдкрд░ рдХреБрдЫ рдХрд┐рдпрд╛

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

рдЗрд╕реЗ рд╣рд░ рдЬрдЧрд╣ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреНрдпреЛрдВ рд╣реИ?

рдЗрд╕реЗ рд╣рд░ рдЬрдЧрд╣ рдЗрд╕реНрддреЗрдорд╛рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред https://github.com/dotnet/corefx/issues/8034#issuecomment -260790829 рдкрд░ рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рджреЗрдЦреЗрдВ; рдпрд╣ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЙрди рд▓реЛрдЧреЛрдВ рдкрд░ рд▓рдХреНрд╖рд┐рдд рд╣реИ рдЬреЛ рд╣реИрд╢рд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреНрдпрд╛рджрд╛ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВред рдЬреЛ рд▓реЛрдЧ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдХреНрдпрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╡реЗ рдЗрд╕рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдХреЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЙрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ рдпрд╛ рдирд╣реАрдВред

рд╣реИрд╢рдХреЛрдб рдХреЗ рд╕рдВрдпреБрдХреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣ рдХреНрдпрд╛ рдзрд╛рд░рдгрд╛ рдмрдирд╛рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИ? рдпрджрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рд░ рдЬрдЧрд╣ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХреНрдпрд╛ рдпрд╣ DDoS рд╣рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдирдП рд░рд╛рд╕реНрддреЗ рдЦреЛрд▓рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ?

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд░реНрддрдорд╛рди рд╣реИрд╢ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ hash(0, x) == x ред рддреЛ рдЕрдЧрд░ рд╣реИрд╢ рдХреЛ рдирд▓ рдпрд╛ рд╢реВрдиреНрдп рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдЦрд┐рд▓рд╛рдИ рдЬрд╛рддреА рд╣реИ рддреЛ рдпрд╣ 0 рд░рд╣реЗрдЧрд╛ред рдХреЛрдб рджреЗрдЦреЗрдВред рдпрд╣ рдХрд╣рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдирд▓ рдХреА рдЧрд┐рдирддреА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдирд▓ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдпрд╣рд╛рдБ рдХреА рддрд░рд╣ рдХреБрдЫ рдЕрдзрд┐рдХ рдордЬрдмреВрдд (рд▓реЗрдХрд┐рди рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдорд╣рдВрдЧрд╛) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЬреЛ рд╢реВрдиреНрдп рд╕реЗ рд╢реВрдиреНрдп рдХреА рдореИрдкрд┐рдВрдЧ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЬрд╛рджреВ рд╕реНрдерд┐рд░рд╛рдВрдХ рдЬреЛрдбрд╝рддрд╛ рд╣реИред

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

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

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдПрдХ рдмрдбрд╝реЗ рд╕рдВрд░рдЪрдирд╛ рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╕рдВрдпреЛрдЬрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╣рд░ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдлрд┐рдЯ рд╣реЛрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗред

рдХреНрдпрд╛ ASP.NET Core рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╣реИрд╢рдХреЛрдб рдХреЙрдореНрдмрд┐рдирд░ рдХреЛ рдмрджрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИ - рдЬрд┐рд╕рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ 64-рдмрд┐рдЯ рд░рд╛рдЬреНрдп рд╣реИ - рдЗрд╕рдХреЗ рд╕рд╛рде?

рдореИрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИрд╢ рдХреЛрдб рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд░рд╣рд╛ рдерд╛ рдЬреЛ рд╕рднреА рдЕрдВрддрд░-рдЖрдХрд╛рд░ (FnvHashCode, рдЖрджрд┐) рд╣реИрдВред

рдХреНрдпрд╛ рдЗрд╕рд╕реЗ рд╕рдВрдпреБрдХреНрдд рд╡рд┐рд╕реНрдлреЛрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛? рдпрд╣ рдПрдкреАрдЖрдИ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдХрд┐ рдпрд╣ рдПрдкреАрдЖрдИ рдбрд┐рдЬрд╛рдЗрди рдХрд┐рд╕ рдУрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИред

@jkotas рдореИрдВрдиреЗ рдЪрд░реНрдЪрд╛ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЗрд╕реА рддрд░рд╣ рдХреА рдЖрдкрддреНрддрд┐рдпрд╛рдВ https://github.com/dotnet/corefx/issues/13757

рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рд╣реИрд╢рдХреЛрдб рдХреЙрдореНрдмрд┐рдирд░ рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдЬреЛ 99% рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдмреНрд░реЗрдирд░ рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕реЗ рдХреЗрд╡рд▓ 32-рдмрд┐рдЯ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

BTW: ASP.NET рдиреЗ рдореВрд▓ рд░реВрдк рд╕реЗ рд╣реИрд╢рдХреЛрдб рд╕рдВрдпреЛрдЬрди рдХреЗ рд▓рд┐рдП рдзрд╛рд░рд╛рдкреНрд░рд╡рд╛рд╣ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рд╕реЗ рдмрдЧ рдЖрд╕рд╛рдиреА рд╕реЗ рдЫреВрдЯ рдЧрдП: https://github.com/aspnet/Razor/pull/537

@jkotas рд╣реИрд╢-рдмрд╛рдврд╝ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВред
рдЕрд╕реНрд╡реАрдХрд░рдг: рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдирд╣реАрдВ (рдЖрдкрдХреЛ рдПрдХ рд╕реЗ рдкрд░рд╛рдорд░реНрд╢ рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдПрдордПрд╕ рдХреЗ рдкрд╛рд╕ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдХреБрдЫ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИрдВ) ред

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

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЬрдм рдореИрдВ рд▓рд┐рдЦ рд░рд╣рд╛ рдерд╛ рддрдм рдЖрдкрдиреЗ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдерд╛ред рдЗрд╕рдХреЗ рдЖрд▓реЛрдХ рдореЗрдВ, рдЖрдкрдХреЗ рд▓рд┐рдП 64 рдмрд┐рдЯ рд░рд╛рдЬреНрдп рдХреЛ рдХреНрдпрд╛ рд▓рд╛рдн рд╣реЛрддрд╛ рд╣реИ?

@jkotas рдореИрдВрдиреЗ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рдореБрджреНрджреЗ рдХреЛ рджреЗрдЦрд╛ред рдЗрд╕реЗ рдХрд╣рддреЗ рд╣реИрдВ:

рдПрд╕реНрдкрдиреЗрдЯ/рд╕рд╛рдорд╛рдиреНрдп#40 . рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛

https://github.com/aspnet/Common/issues/40 рдХрд╛ рд╡рд┐рд╡рд░рдг:

рдмрдЧ рд╕реНрдкреЙрдЯ рдХрд░реЗрдВ:

public class TagBuilder
{
    private Dictionary<string, string> _attributes;
    private string _tagName;
    private string _innerContent;

    public override int GetHashCode()
    {
        var hash = HashCodeCombiner.Start()
            .Add(_tagName, StringComparer.Ordinal)
            .Add(_innerContent, StringComparer.Ordinal);

        foreach (var kvp in _attributes)
        {
            hash.Add(kvp.Key, StringComparer.Ordinal).Add(kvp.Value, StringComparer.Ordinal);
        }

        return hash.Build();
    }
}

рдХрд╛рдореЗ рдУрдиред рдпрд╣ рддрд░реНрдХ рдпрд╣ рдХрд╣рдиреЗ рдЬреИрд╕рд╛ рд╣реИ рдХрд┐ string рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рд▓реЛрдЧреЛрдВ рдХреЛ рдпрд╣ рдПрд╣рд╕рд╛рд╕ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ Substring рдПрдХ рдирдИ рд╕реНрдЯреНрд░рд┐рдВрдЧ рджреЗрддрд╛ рд╣реИред рдЧреЛрдЪрд░реНрд╕ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдореНрдпреВрдЯреЗрдмрд▓ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХрд╣реАрдВ рдЬреНрдпрд╛рджрд╛ рдЦрд░рд╛рдм рд╣реИрдВ; рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╣реИрд╢-рдмрд╛рдврд╝ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВред

рдЗрд╕рдХреЗ рджреЛ рдкрд╣рд▓реВ рд╣реИрдВ: рдирд┐рд░реНрдорд╛рдг рджреНрд╡рд╛рд░рд╛ рд╕рд╣реА рдбрд┐рдЬрд╛рдЗрди (рдордЬрдмреВрдд рдбреЗрдЯрд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░, рдЖрджрд┐); рдФрд░ рдореМрдЬреВрджрд╛ рдбрд┐рдЬрд╛рдЗрди рдореЗрдВ рдореБрджреНрджреЛрдВ рдХрд╛ рд╢рдордиред рджреЛрдиреЛрдВ рд╣реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред

@karelz рдкреИрд░рд╛рдореАрдЯрд░ рдирд╛рдордХрд░рдг рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ

рдореИрдВрдиреЗ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдЕрдкрдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡ dotnet/corefx#8034 (рдЯрд┐рдкреНрдкрдгреА) рдореЗрдВ рдЪреБрдкрдЪрд╛рдк/рджреБрд░реНрдШрдЯрдирд╛ рд╕реЗ arg рдирд╛рдо obj рдХреЛ value рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдУрдмреАрдЬреЗ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░ рджрд┐рдпрд╛ рдЬреЛ рдЖрдИрдПрдордУ рдЖрдкрдХреЛ рдЬреЛ рдорд┐рд▓рддрд╛ рд╣реИ рдЙрд╕реЗ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдХреИрдкреНрдЪрд░ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ рдирд╛рдо рдорд╛рди "int" рд╣реИрд╢ рдорд╛рди рд╕реЗ рдЕрдзрд┐рдХ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред
рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдореИрдВ рддрд░реНрдХ рдирд╛рдо рдкрд░ рдЖрдЧреЗ рдХреА рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЖрдЗрдП рдЗрд╕реЗ рдЙрджреНрджреЗрд╢реНрдп рдкрд░ рдмрджрд▓реЗрдВ рдФрд░ рдкрд┐рдЫрд▓реЗ рд╕реНрд╡реАрдХреГрдд рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдЕрдВрддрд░ рдХрд╛ рдЯреНрд░реИрдХ рд░рдЦреЗрдВред

рдореИрдВ рднрд╡рд┐рд╖реНрдп рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ, рдереЛрдХ рдореЗрдВ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ рдЬреЛрдбрд╝рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: CombineRange(ReadOnlySpan<T>) ред рдЕрдЧрд░ рд╣рдордиреЗ рдЗрд╕реЗ obj рдирд╛рдо рджрд┐рдпрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рд╡рд╣рд╛рдВ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдирд╛рдо рджреЗрдирд╛ рд╣реЛрдЧрд╛ objs , рдЬреЛ рдмрд╣реБрдд рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЗрд╕реЗ item рдирд╛рдо рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП; рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рд╣рдо рд╕реНрдкреИрди рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдирд╛рдо рджреЗ рд╕рдХрддреЗ рд╣реИрдВ items ред рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ред

@jkotas рд╕рд╣рдордд рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдБ рдмрд┐рдВрджреБ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рд╕рдВрдпреЛрдЬрдХ рд╕реНрддрд░ рдкрд░ рдХреБрдЫ рднреА рдХрдо рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ ...

рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рд╣рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд╡рд╣ рд╣реИ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдмреАрдЬ, рдЬреЛ рд╕рднреА рд░рд╛рдЬреНрдпреЛрдВ рдФрд░ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдпрд╛рдж рд╣реИ рдХрд┐ рдореИрдВрдиреЗ string рдкрд░ рдХреЛрдб рджреЗрдЦрд╛ рд╣реИ рдФрд░ рдпрд╣ рдкреНрд░рддрд┐ рдмрд┐рд▓реНрдб рддрдп рд╣реИред (рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЧрд▓рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рдмрд╣реБрдд рд╕рдордп рдкрд╣рд▓реЗ рдерд╛)ред рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдмреАрдЬреЛрдВ рдХрд╛ рдЙрдЪрд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реА рдПрдХрдорд╛рддреНрд░ рд╢рдорди рд╣реИ рдЬреЛ рдпрд╣рд╛рдВ рд▓рд╛рдЧреВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

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

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

рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ M1 рдФрд░ M2 рдЕрд▓рдЧ-рдЕрд▓рдЧ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдмреАрдЬреЛрдВ рдХреЗ рд╕рд╛рде rs1 рдФрд░ rs2 ....
M1 h1 = hash('a', rs1) рдФрд░ h2=hash('b', rs1)
M2 h1' = hash('a', rs2) рдФрд░ h2'=hash('b', rs2)
рдпрд╣рд╛рдВ рдореБрдЦреНрдп рдмрд┐рдВрджреБ рдпрд╣ рд╣реИ рдХрд┐ h1 рдФрд░ h1' рдПрдХ рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рд╕рд╛рде рднрд┐рдиреНрди рд╣реЛрдЧрд╛ 1/ (int.MaxInt-1) (рдпрджрд┐ hash рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ) рдЬреЛ рд╕рднреА рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ рдЕрдЪреНрдЫрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдорд┐рд▓рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП рдЬреЛ рднреА c(x,y) рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ (рдпрджрд┐ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛ рддреЛ) рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрд░реЛрдд рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╢рдорди рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореБрдЭреЗ рдХреЛрдб рдорд┐рд▓рд╛, рдЖрдк рдорд╛рд░реНрд╡рд┐рди 32 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдЕрдм рдкреНрд░рддреНрдпреЗрдХ рдбреЛрдореЗрди рдкрд░ рдмрджрд▓рддрд╛ рд╣реИред рддреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд▓рд┐рдП рд╢рдорди рдкреНрд░рддрд┐ рд░рди рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдмреАрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛, рдХрд╛рдлреА рдЕрдЪреНрдЫрд╛ рд╢рдорди рд╣реИред

@jkotas

рдХреНрдпрд╛ ASP.NET Core рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╣реИрд╢рдХреЛрдб рдХреЙрдореНрдмрд┐рдирд░ рдХреЛ рдмрджрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИ - рдЬрд┐рд╕рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ 64-рдмрд┐рдЯ рд░рд╛рдЬреНрдп рд╣реИ - рдЗрд╕рдХреЗ рд╕рд╛рде?

рдмрд┐рд▓реНрдХреБрд▓; рдпрд╣ рд╕рдорд╛рди рд╣реИрд╢рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЯрдХреНрдХрд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдорд╛рдкрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднреА рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдРрдк рдмрдирд╛рдпрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ 10 рдмрд╛рд░ рдЪрд▓рд╛рдпрд╛ рд╣реИред 64 рдмрд┐рдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдХреЛрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИред

рдореИрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИрд╢ рдХреЛрдб рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд░рд╣рд╛ рдерд╛ рдЬреЛ рд╕рднреА рдЕрдВрддрд░-рдЖрдХрд╛рд░ (FnvHashCode, рдЖрджрд┐) рд╣реИрдВред

рдХреНрдпрд╛ рдЗрд╕рд╕реЗ рд╕рдВрдпреБрдХреНрдд рд╡рд┐рд╕реНрдлреЛрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛? рдпрд╣ рдПрдкреАрдЖрдИ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдХрд┐ рдпрд╣ рдПрдкреАрдЖрдИ рдбрд┐рдЬрд╛рдЗрди рдХрд┐рд╕ рдУрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИред

@jkotas , рдпрд╣ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдбрд┐рдЬрд╝рд╛рдЗрди рднрд╡рд┐рд╖реНрдп рдХреЗ рд╣реИрд╢рд┐рдВрдЧ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЛ рдкрддреНрдерд░ рдореЗрдВ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдЙрдиреНрд╣реЗрдВ рдЕрдзрд┐рдХ рдЙрдиреНрдирдд рдкрд░рд┐рджреГрд╢реНрдп рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдПрдХ рдЕрд▓рдЧ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреИрд╕реЗ рдХрд┐ рдбреЙрдЯрдиреЗрдЯ/рдХреЛрд░рдПрдлрдПрдХреНрд╕ # 13757, рдФрд░ рдПрдХ рдЕрд▓рдЧ рдбрд┐рдЬрд╛рдЗрди рдЪрд░реНрдЪрд╛ рд╣реЛрдЧреАред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╣реИрд╢рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдПрдкреАрдЖрдИ рд╣реЛрдирд╛ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдирдП рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдУрд╡рд░рд░рд╛рдЗрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдХрд░ рд░рд╣реЗ рд╣реИрдВ GetHashCode ред

рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рд╣реИрд╢рдХреЛрдб рдХреЙрдореНрдмрд┐рдирд░ рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдЬреЛ 99% рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдмреНрд░реЗрдирд░ рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕реЗ рдХреЗрд╡рд▓ 32-рдмрд┐рдЯ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рд╣рдореЗрдВ 32 рдмрд┐рдЯ рд╕реЗ рдЕрдзрд┐рдХ рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрдм рд╣реЛрдЧреА? рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдпрджрд┐ рдпрд╣ рд▓реЛрдЧреЛрдВ рдХреЛ рдХрд╕реНрдЯрдо рд╣реИрд╢рд┐рдВрдЧ рддрд░реНрдХ рдореЗрдВ рдкреНрд▓рдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ (рдлрд┐рд░ рд╕реЗ) рдЗрд╕реЗ рдПрдХ рдЙрдиреНрдирдд рдкрд░рд┐рджреГрд╢реНрдп рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдбреЙрдЯрдиреЗрдЯ/рдХреЛрд░рдПрдлрдПрдХреНрд╕ # 13757 рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред

рдЖрдк Marvin32 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдЕрдм рдкреНрд░рддреНрдпреЗрдХ рдбреЛрдореЗрди рдкрд░ рдмрджрд▓рддрд╛ рд╣реИ

рдареАрдХ рд╣реИ, рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИрд╢рдХреЛрдб рд░реИрдВрдбрдорд╛рдЗрдЬреЗрд╢рди рд╢рдорди рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ .NET рдХреЛрд░ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИред рдпрд╣ рд╕рдВрдЧрддрддрд╛ рдХреЗ рдХрд╛рд░рдг рдкреВрд░реНрдг .NET Framework рдореЗрдВ рд╕реНрдЯреИрдВрдбрдЕрд▓реЛрди рдРрдкреНрд╕ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИ; рдпрд╣ рдХреЗрд╡рд▓ рд╡рд┐рдЪрд┐рддреНрд░рддрд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдХреНрд╖рдо рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЙрдЪреНрдЪ рдЬреЛрдЦрд┐рдо рд╡рд╛рд▓реЗ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ)ред

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА .NET рдХреЛрд░ рдореЗрдВ рдЧреИрд░-рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╣реИрд╢рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд╣рдЯрд╛рдирд╛ рдареАрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рдЙрдореНрдореАрдж рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдпрд╣ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИрд╢рдХреЛрдб рдЧрдгрдирд╛ рдХреЛ рдереЛрдбрд╝рд╛ рддреЗрдЬ рдХрд░ рджреЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рдЧреИрд░-рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдкрде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдЗрд╕рдХреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рд╣реЛрдЧреАред

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

рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЙрджреНрджреЗрд╢реНрдп рд╣реИрд╢ рдХреЙрдореНрдмрд┐рдирд░ рдХреЛ рдЗрд╕ рд╢рдорди рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдП: рдЗрд╕реЗ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдмреАрдЬ рдФрд░ рдПрдХ рдордЬрдмреВрдд рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрд╢рдХреЛрдб рд╕рдВрдпреЛрдЬрди рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рдпрд╣ рдЙрд╕реА рдорд╛рд░реНрд╡рд┐рди 32 рдХреЛ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИрд╢рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред

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

@jkotas , рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдВрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИрд╢ рдХреЛрдб рд╕рдВрдпреЛрдЬрдХ Marvin32 рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЧреИрд░-рдпрд╛рджреГрдЪреНрдЫрд┐рдХ string.GetHashCode рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рдорд╛рди рдЕрдиреБрднрд╡рд╣реАрди DJBx33x рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЙрджреНрджреЗрд╢реНрдп рд╣реИрд╢ рдХреЙрдореНрдмрд┐рдирд░ рдХреЛ рдЗрд╕ рд╢рдорди рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдП: рдЗрд╕реЗ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдмреАрдЬ рдФрд░ рдПрдХ рдордЬрдмреВрдд рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрд╢рдХреЛрдб рд╕рдВрдпреЛрдЬрди рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рдпрд╣ рдЙрд╕реА рдорд╛рд░реНрд╡рд┐рди 32 рдХреЛ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИрд╢рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред

рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрди рдЬрдЧрд╣реЛрдВ рдкрд░ рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╣реИрд╢ DoS рд╣рдорд▓реЛрдВ рд╕реЗ рдЧреНрд░рд╕реНрдд рд╣реИрдВред рдпрд╣ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рдХреНрд╖рд┐рдд рд╣реИ рдЬреЛ рдЬреЛрдбрд╝рдиреЗ/xor рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмреЗрд╣рддрд░ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдФрд░ https://github.com/dotnet/coreclr/pull/4654 рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЛ рд░реЛрдХрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреЗ

рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЙрджреНрджреЗрд╢реНрдп рд╣реИрд╢ рдХреЙрдореНрдмрд┐рдирд░ рдХреЛ рдЗрд╕ рд╢рдорди рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдП: рдЗрд╕реЗ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдмреАрдЬ рдФрд░ рдПрдХ рдордЬрдмреВрдд рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрд╢рдХреЛрдб рд╕рдВрдпреЛрдЬрди рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рдпрд╣ рдЙрд╕реА рдорд╛рд░реНрд╡рд┐рди 32 рдХреЛ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИрд╢рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред

рдлрд┐рд░ рд╣рдореЗрдВ рд╕реА # рдЯреАрдо рдХреЗ рд╕рд╛рде рдмрд╛рдд рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рд╡реЗ ValueTuple рд╣реИрд╢рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХреЛ рдХрдо рдХрд░ рд╕рдХреЗрдВред рдХреНрдпреЛрдВрдХрд┐ рдЙрд╕ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрдЪреНрдЪ рдЬреЛрдЦрд┐рдо рд╡рд╛рд▓реЗ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рднреА рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ Tuple https://github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/Tuple.cs#L60 рдпрд╛ System.Numerics.HashHelpers (рдкреВрд░реЗ рд╡рд┐рд╢реНрд╡ рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд) рдЬрдЧрд╣)ред

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

рдпрд╣ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рдХреНрд╖рд┐рдд рд╣реИ рдЬреЛ рдЬреЛрдбрд╝рдирд╛/xor . рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмреЗрд╣рддрд░ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ

рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдордЬрдмреВрдд рд╣реЛрдирд╛ рдЬрд░реВрд░реА рд╣реИред .NET рдХрд╛ рдкреНрд░рдореБрдЦ рдореВрд▓реНрдп рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЙрди рд▓реЛрдЧреЛрдВ рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдмреЗрд╣рддрд░ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВред

рдФрд░ рдЬрдм рд╣рдо рдЗрд╕ рдкрд░ рд╣реЛрдВ, рддреЛ IntPtr рдмрд╛рд░реЗ рдореЗрдВ рди рднреВрд▓реЗрдВ https://github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/IntPtr.cs#L119
рд╡рд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдмреБрд░рд╛ рд╣реИ, xor рд╢рд╛рдпрдж рд╣рдорд╛рд░реЗ рд╡рд╣рд╛рдВ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╣реИ рдХреНрдпреЛрдВрдХрд┐ bad рдХреЗ рд╕рд╛рде рдЯрдХрд░рд╛рд╡ рд╣реЛрдЧрд╛ dab ред

рдПрдХ рдХрдо ValueTuple рд╣реИрд╢рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд▓рд╛рдЧреВ рдХрд░реЗрдВ

рдЕрдЪреНрдЫреА рдмрд╛рддред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ ValueTuple рднреЗрдЬ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдпрд╛ рдХреНрдпрд╛ рдпрд╣ рдЕрднреА рднреА рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред https://github.com/dotnet/corefx/issues/14046 рдЦреЛрд▓рд╛ рдЧрдпрд╛

рдЖрдЗрдП IntPtr . рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рди рднреВрд▓реЗрдВ

рдпреЗ рдкрд┐рдЫрд▓реА рдЧрд▓рддрд┐рдпрд╛рдБ рд╣реИрдВ ... рдЗрдиреНрд╣реЗрдВ рдареАрдХ рдХрд░рдиреЗ рдХреА рд╕реАрдорд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИред

@jkotas

рдпреЗ рдкрд┐рдЫрд▓реА рдЧрд▓рддрд┐рдпрд╛рдБ рд╣реИрдВ ... рдЗрдиреНрд╣реЗрдВ рдареАрдХ рдХрд░рдиреЗ рдХреА рд╕реАрдорд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИред

рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдиреЗрдЯ рдХреЛрд░ рдХреЗ рдмрд┐рдВрджреБрдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ "рдЫреЛрдЯреЗ" рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╛рд░ рдмрд╣реБрдд рдХрдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдЧрд░ рдХреЛрдИ IntPtr.GetHashCode (рдЬреЛ рдЙрдиреНрд╣реЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП) рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╡реЗ .Net Core рдХреЗ рдЕрдкрдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЕрдкрдЧреНрд░реЗрдб рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕ рддрд░рд╣ рдХреЗ "рдЫреЛрдЯреЗ" рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╛рд░ рдмрд╣реБрдд рдХрдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

рд╣рд╛рдБ, рдпрд╣ рд╣реИ - рдкреВрд░реНрдг .NET Framework рдХреА рддреБрд▓рдирд╛ рдореЗрдВред рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЕрднреА рднреА рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрджрд▓рд╛рд╡ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдирд╛ рд╣реИ рдФрд░ рдЖрдк рдкрд╛рдПрдВрдЧреЗ рдХрд┐ рдпрд╣ рджрд░реНрдж рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓ рдХрд╛ рдЙрджрд╛рд╣рд░рдг Tuple<T> рд╣реИрд╢рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИ рдЬреЛ F# рдХреЗ рдЯреВрдЯрдиреЗ рдХреЗ рдХрд╛рд░рдг рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ рд╣реИ: https://github.com/dotnet/coreclr/pull/6767#issuecomment -256896016

@jkotas

рдЕрдЧрд░ рд╣рдо HashCode 64-рдмрд┐рдЯ рдмрдирд╛рддреЗ, рддреЛ рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдбрд┐рдЬрд╝рд╛рдЗрди 32-рдмрд┐рдЯ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдкреВрд░реНрдг рдХреЛ рдорд╛рд░ рджреЗрдЧрд╛? рдореИрдВ рдЕрдиреНрдп рдкрд╛рдардХреЛрдВ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ, рдПрдХ рдмрд┐рд▓реНрдбрд░ рдкреИрдЯрд░реНрди рдмрд╣реБрдд рдЦрд░рд╛рдм рд▓рдЧрддрд╛ рд╣реИред

рдкреВрд░реНрдг рдХреЛ рдорд╛рд░ рдбрд╛рд▓реЛ - рдирд╣реАрдВред рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЪреАрдиреА рдХреЗ рд▓рд┐рдП рднреБрдЧрддрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдкреНрд░рджрд░реНрд╢рди рдЬреБрд░реНрдорд╛рдирд╛ - рд╣рд╛рдБред

рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЪреАрдиреА рдХреЗ рд▓рд┐рдП рднреБрдЧрддрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдкреНрд░рджрд░реНрд╢рди рдЬреБрд░реНрдорд╛рдирд╛ - рд╣рд╛рдБред

рдХреНрдпрд╛ рдпрд╣ рдРрд╕рд╛ рдХреБрдЫ рд╣реИ рдЬрд┐рд╕реЗ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЬреЗрдЖрдИрдЯреА рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

рдкрд░рдлреЗрдХреНрдЯ рдХреЛ рдорд╛рд░рддрд╛ рд╣реИ - рдирд╣реАрдВред
рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЪреАрдиреА рдХреЗ рд▓рд┐рдП рднреБрдЧрддрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдкреНрд░рджрд░реНрд╢рди рдЬреБрд░реНрдорд╛рдирд╛ - рд╣рд╛рдБред

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

рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рдЙрджреНрдзреГрдд рдХрд░рдирд╛:

рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдордЬрдмреВрдд рд╣реЛрдирд╛ рдЬрд░реВрд░реА рд╣реИред .NET рдХрд╛ рдкреНрд░рдореБрдЦ рдореВрд▓реНрдп рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЙрди рд▓реЛрдЧреЛрдВ рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдмреЗрд╣рддрд░ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВред

рдореИрдВ рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рдПрдХ рдордЬрдмреВрдд рдПрдкреАрдЖрдИ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдмреЗрд╣рддрд░ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВред

рдореИрдВ рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рдПрдХ рдордЬрдмреВрдд рдПрдкреАрдЖрдИ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдмреЗрд╣рддрд░ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВред

рд╕рд╣рдорддред рд╕реЛрдЪрд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рд╣реИ рдХрд┐ рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╕рдВрд░рдЪрдирд╛ рдирд┐рд░реНрдорд╛рддрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИред рдореИрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрди рд╕рднреА рд╕рдордп рдХреА рд╡рдЬрд╣ рд╕реЗ рд╡реЗ рдЕрдЪреНрдЫрд╛ рдФрд░ рддрдВрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред [MustNotCopy] рдПрдиреЛрдЯреЗрд╢рди рдХрд┐рд╕реА рдХреЛ рднреА?

рдорд╕реНрдЯрдиреЙрдЯрдХреЙрдкреА рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдкреНрд░реЗрдореА рдХрд╛ рд╕рдкрдирд╛ рд╕рдЪ рд╣реЛрдиреЗ рдЬреИрд╕рд╛ рд╣реИред @jaredpar?

MustNotCopy рдХреЗрд╡рд▓ рд╕реНрдЯреИрдХ рдХреА рддрд░рд╣ рд╣реИ рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдФрд░ рднреА рдХрдард┐рди рд╣реИ

рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдХреЛрдИ рд╡рд░реНрдЧ рди рдмрдирд╛рдПрдВ рд▓реЗрдХрд┐рди рд╣реИрд╢ рдХреЛ рдЧрдардмрдВрдзрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐рдпрд╛рдВ рдмрдирд╛рдПрдВ

static class HashHelpers
{
    [MethodImpl(MethodImplOptions.AggressiveInlining)]
    public static int CombineHash(this int hash1, int hash2);
    [MethodImpl(MethodImplOptions.AggressiveInlining)]
    public static int CombineHash<T>(this int hash, T value);
    [MethodImpl(MethodImplOptions.AggressiveInlining)]
    public static int CombineHash<T>(this int hash, T value, IEqualityComparer<T> comparer);
    [MethodImpl(MethodImplOptions.AggressiveInlining)]
    public static int CombineHash<T>(this int hash, IEnumerable<T> values);
    [MethodImpl(MethodImplOptions.AggressiveInlining)]
    public static int CombineHash<T>(this int hash, IEnumerable<T> values, IEqualityComparer<T> comparer);
}

рдмрд╕ рдЗрддрдирд╛ рд╣реА! рдпрд╣ рддреЗрдЬрд╝ рдФрд░ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИред

@AlexRadch рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕рднреА рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ рд╕реВрдЪреА рдХреЛ рдкреНрд░рджреВрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рди рдХрд┐ рдХреЗрд╡рд▓ рд╣реИрд╢ рдХреЗ рд░реВрдк рдореЗрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдХреЗ рдкрд╛рд╕ рдРрд╕реЗ рддрд░реАрдХреЗ рд╣реИрдВ рдЬреЛ рд╣реИрд╢ рдХреЛрдб рдХреА рдЧрдгрдирд╛ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕реЗ рдХреИрд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ? рдХреНрдпрд╛ рдЖрдкрдХреЛ рдХреБрдЫ рдЧреИрд░-рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рд╣реИ рдЬреИрд╕реЗ рд╢реВрдиреНрдп рд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛? рдпрд╛рдиреА 0.CombineHash(this.FirstName).CombineHash(this.LastName) ред

рдЕрджреНрдпрддрди: dotnet/corefx#14046 рдореЗрдВ рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдпрд╣ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдХрд┐ рдореМрдЬреВрджрд╛ рд╣реИрд╢ рдлреЙрд░реНрдореВрд▓рд╛ ValueTuple рд▓рд┐рдП рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛:

@jamesqo рдорджрдж рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
@jkotas рдФрд░ @VSadov рдХреЗ рд╕рд╛рде рдЕрдВрддрд┐рдо рдЪрд░реНрдЪрд╛ рд╕реЗ, рд╣рдо рдпрд╛рджреГрдЪреНрдЫрд┐рдХрдХрд░рдг/рд╕реАрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝рдирд╛ рдареАрдХ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рдорд╣рдВрдЧреЗ рд╣реИрд╢ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрдкрдирд╛рдиреЗ рд╕реЗ рдкреАрдЫреЗ
рд░реИрдВрдбрдорд╛рдЗрдЬреЗрд╢рди рдХрд░рдиреЗ рд╕реЗ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЬрд░реВрд░рдд рдкрдбрд╝рдиреЗ рдкрд░ рд╣реИрд╢ рдлрдВрдХреНрд╢рди рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рджреНрд╡рд╛рд░ рдмрдирд╛ рд░рд╣рддрд╛ рд╣реИред

@jkotas , рдХреНрдпрд╛ рд╣рдо рд╡рд░реНрддрдорд╛рди ROL 5-рдЖрдзрд╛рд░рд┐рдд рд╣реИрд╢ рдХреЛ HashCode рд▓рд┐рдП рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕реЗ рд╡рд╛рдкрд╕ 4 рдмрд╛рдЗрдЯреНрд╕ рддрдХ рд╕рд┐рдХреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ? рдпрд╣ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЙрдкреА рдХрд░рдиреЗ рдХреА рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдЦрддреНрдо рдХрд░ рджреЗрдЧрд╛ред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ HashCode.Empty рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╣реИрд╢ рдорд╛рди рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

@svick
рд╣рд╛рдБ рдпрд╣ рд╕рднреА рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рджреВрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЕрд▓рдЧ рдирд╛рдо рд╕реНрдерд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдпрджрд┐ рдЖрдк рд╣реИрд╢ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЗрд╕реЗ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдирд╣реАрдВ рджреЗрдЦреЗрдВрдЧреЗред

0.CombineHash(this.FirstName).CombineHash(this.LastName) рдХреЛ this.FirstName.GetHash().CombineHash(this.LastName) рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП

рдмреАрдЬ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рдЕрдЧрд▓реА рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ

static class HashHelpers
{
    public static int ClassSeed<T>();
}

class SomeClass
{
    int GetHash()
    {
        return HashHelpers.ClassSeed<SomeClass>().CombineHash(value1).CombineHash(value2);
    }
}

рддреЛ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧ рдореЗрдВ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╣реИрд╢ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдмреАрдЬ рд╣реЛрдВрдЧреЗред

@jkotas , рдХреНрдпрд╛ рд╣рдо рд╡рд░реНрддрдорд╛рди ROL 5-рдЖрдзрд╛рд░рд┐рдд рд╣реИрд╢ рдХреЛ рд╣реИрд╢рдХреЛрдб рдХреЗ рд▓рд┐рдП рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕реЗ рд╡рд╛рдкрд╕ 4 рдмрд╛рдЗрдЯреНрд╕ рддрдХ рд╕рд┐рдХреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ?

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

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

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

рджреЗрдЦреЗрдВ рдХрд┐ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╣реИрд╢ рдлрд╝рдВрдХреНрд╢рди рдХреНрдпрд╛ рдмрдирд╛рддрд╛ рд╣реИ (рдЬреЛ рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ xor : http://softwareengineering.stackexchange.com/questions/49550/who-hashing-algorithm-is-best-for-uniqueness-and -рдЧрддрд┐ рдФрд░ https://research.neustar.biz/2012/02/02/choosing-a-good-hash-function-part-3/

@jamesqo рдмреАрдЯреАрдбрдмреНрд▓реВ, рдореБрдЭреЗ рдЕрднреА рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рд╕рдВрдпреЛрдЬрдХ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛: "рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣реИрд╢ (рд░рдирдЯрд╛рдЗрдо рд╣реИрд╢ рдирд╣реАрдВ) рдХрд╛ рд╕рдВрдпреЛрдЬрди рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдмреАрдЬ рд╣рд░ рдмрд╛рд░ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛ред" ... рдмреАрдЬ рдХреЗ рд╕рд╛рде рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдирд┐рд░реНрдорд╛рддрд╛?

@jkotas

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

рдХреНрдпрд╛ рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдкрдбрд╝рддрд╛ рд╣реИ рдЬрдм рдЕрдВрдд рдореЗрдВ рдпрд╣ рдПрдХ int рдореЗрдВ рд╕рдВрдШрдирд┐рдд рд╣реЛ рдЬрд╛рдПрдЧрд╛?

@jamesqo рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ, рд░рд╛рдЬреНрдп рдХрд╛ рдЖрдХрд╛рд░ рдХреЗрд╡рд▓ рдХрд╛рд░реНрдп рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдордЬрдмреВрддреА рдкрд░ рдирд╣реАрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдкрдиреЗ рд╣реИрд╢ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмрджрддрд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдЧрдардмрдВрдзрди рдЙрд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЖрдк рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдмрд░реНрдмрд╛рдж рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЬрдмрд░рджрд╕реНрддреА рд╕реЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХрддрд╛ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдХреЛрд░реЛрд▓рд░реА: рдпрд╣ рдЖрдк рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдЙрддреНрдХреГрд╖реНрдЯ рд╣реИ рдпрд╛ рдЖрдк рдЗрд╕реЗ рдмрджрддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ рдЧрд╛рд░рдВрдЯреАрдХреГрдд рд╣реИрдВред

рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпрджрд┐ рдХреЛрдИ рд╕рд╣рд╕рдВрдмрдВрдз рдирд╣реАрдВ рд╣реИ, рддреЛ 32-рдмрд┐рдЯ рд╕реНрдерд┐рддрд┐ рдФрд░ рд╕рд░рд▓ рд░реЛрдЯрд▓ (рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ xor) рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рд╕рд╣рд╕рдВрдмрдВрдз рд╣реИ, рддреЛ рдпрд╣ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред

рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ рдХрд┐рд╕реА рдиреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд░реНрдгреЛрдВ рд╕реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИрд╢рдХреЛрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рд╣реИред рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рддрд╛ рд╣реИ:

for (int i = 0; i < str.Length; i++)
   hashCodeBuilder.Add(str[i]);

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

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

namespace System
{
    public struct HashCode : IEquatable<HashCode>
    {
       // add this
       public static HashCode CreateRandomized(Type type);
       // or add this
       public static HashCode CreateRandomized<T>();
    }
}

@jkotas рдореИрдВрдиреЗ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдХрд┐рдпрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдХрд╣ рд░рд╣рд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЧрддрд┐ рдХрд╛ рд╡реНрдпрд╛рдкрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ

рдЕрдЧрд░ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░рд╛ рд▓рдХреНрд╖реНрдп рдпрд╣ рд╣реИ рдХрд┐ рдХреЛрдИ рднреА рдЗрд╕рдХреЗ рд╕рд╛рде рдмреЗрд╡рдХреВрдлреА рди рдХрд░реЗ, 64 рдмрд┐рдЯ рд░рд╛рдЬреНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХреБрдЫ рднреА рдареАрдХ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ, рд╣рдо рд╕рд┐рд░реНрдл рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЫреБрдкрд╛ рд░рд╣реЗ рд╣реИрдВред рдПрдХ рдЗрдирдкреБрдЯ рдмрдирд╛рдирд╛ рдЕрднреА рднреА рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ рдЬреЛ рдЙрд╕ рд╕рд╣рд╕рдВрдмрдВрдз рдХрд╛ рдлрд╛рдпрджрд╛ рдЙрдард╛рдПрдЧрд╛ред рдЬреЛ рд╣рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдЙрд╕реА рддрд░реНрдХ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдореИрдВрдиреЗ 18 рджрд┐рди рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдерд╛ред рджреЗрдЦреЗрдВ: https://github.com/dotnet/corefx/issues/8034#issuecomment -261301533

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

рдЕрд╕рдВрдмрджреНрдз рд╣реИрд╢-рдХреЛрдб рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рддрд░реАрдХрд╛ xor...

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

public static HashCode CreateRandomized(Type type); рдпрд╛ public static HashCode CreateRandomized<T>(); рд╡рд┐рдзрд┐рдпреЛрдВ рдпрд╛ рджреЛрдиреЛрдВ рдХреЗ рд╕рд╛рде рд╣реИрд╢ рдХреЛрдб рдпрд╛рджреГрдЪреНрдЫрд┐рдХрд░рдг рдЬреЛрдбрд╝реЗрдВред

@jkotas рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдмреЗрд╣рддрд░ рдкреИрдЯрд░реНрди рдорд┐рд▓ рдЧрдпрд╛ рд╣реЛрдЧрд╛ред рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдо рд╕реА # 7 рд░реЗрдлрд░реА рд░рд┐рдЯрд░реНрди рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддреЗ рд╣реИрдВ? рд╣рд░ рдмрд╛рд░ HashCode рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдПрдХ ref HashCode рд▓реМрдЯрд╛рдПрдВрдЧреЗ рдЬреЛ рдПрдХ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИред

public struct HashCode
{
    private readonly long _value;

    public ref HashCode Combine(int hashCode)
    {
        CombineCore(ref _value, hashCode); // note: modifies the struct in-place
        return ref this;
    }
}

рдЙрдкрдпреЛрдЧ рдкрд╣рд▓реЗ рдЬреИрд╕рд╛ рд╣реА рд░рд╣рддрд╛ рд╣реИ:

return HashCode.Combine(1)
    .Combine(2).Combine(3);

рдХреЗрд╡рд▓ рдирдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдлрд┐рд░ рд╕реЗ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рдЧрдП рд╣реИрдВред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдирдХрд▓ рдФрд░ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдпрддрд╛ рджреЛрдиреЛрдВ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред

( ref this рдЕрднреА рддрдХ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдпрд╣рд╛рдВ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реЛрд╕рд▓рд┐рди рдореЗрдВ рдПрдХ рдкреАрдЖрд░ рджреЗрдЦрддрд╛ рд╣реВрдВ


@AlexRadch рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣реИрд╢ рдХреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рдирд╛ рдмреБрджреНрдзрд┐рдорд╛рдиреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИрд╢ рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдорд╣рдВрдЧрд╛ рд╣реИред

@jamesqo public static HashCode CreateRandomized<T>(); рдЯрд╛рдЗрдк рд╣реИрд╢ рдХреЛрдб рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╣реИрд╢рдХреЛрдб рдмрдирд╛рддрд╛ рд╣реИред

@jamesqo " ref this рдЕрднреА рддрдХ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ"ред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдПрдХ рдмрд╛рд░ рд░реЛрд╕рд▓рд┐рди рдореБрджреНрджрд╛ рддрдп рд╣реЛ рдЬрд╛рдиреЗ рдкрд░, ref this рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдХреЛрд░рдПрдлрдПрдХреНрд╕ рд░реЗрдкреЛ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реЛрдЧрд╛ (рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрд┐рддрдиреА рджреЗрд░ рддрдХ, @stephentoub рд╢рд╛рдпрдж рдЕрдкреЗрдХреНрд╖рд╛рдПрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ)ред

рдбрд┐рдЬрд╛рдЗрди рдЪрд░реНрдЪрд╛ рдпрд╣рд╛рдВ рдЕрднрд┐рд╕рд░рдг рдирд╣реАрдВ рдХрд░ рд░рд╣реА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ 200 рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдмрд╣реБрдд рдХрдард┐рди рд╣реИред
рд╣рдо рдЕрдЧрд▓реЗ рд╕рдкреНрддрд╛рд╣ @jkotas рдХреЛ рд╣рдерд┐рдпрд╛рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЕрдЧрд▓реЗ рдордВрдЧрд▓рд╡рд╛рд░ рдХреЛ рдПрдкреАрдЖрдИ рд╕рдореАрдХреНрд╖рд╛ рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ

рдПрдХ рддрд░рдл: рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдФрд░ "рдзрдиреНрдп рдкреНрд░рд╕реНрддрд╛рд╡" рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рдмрдирд╛рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд▓рдВрдмреА рдЪрд░реНрдЪрд╛ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рдмреЛрдЭ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЧрд▓реЗ рд╕рдкреНрддрд╛рд╣ рд╣реЛрддрд╛ рд╣реИред рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред

@jcouv рдореИрдВ рдареАрдХ рд╣реВрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдЕрднреА рддрдХ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЬрдм рддрдХ рд╣рдо рдЗрд╕ рдбрд┐рдЬрд╛рдЗрди рдХрд╛ рдкрд╛рд▓рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рдЗрд╕реЗ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред (рдореБрдЭреЗ рдпрд╣ рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ Unsafe рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред)

@karelz рдареАрдХ рд╣реИ: рдореБрд╕реНрдХрд╛рди: рдЬрдм рдореЗрд░реЗ рдкрд╛рд╕ рд╕рдордп рд╣реЛрдЧрд╛ рддреЛ рдореИрдВ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдмрд╛рдж рдореЗрдВ рдмрдВрдж рдХрд░ рджреВрдВрдЧрд╛, рдФрд░ рдПрдХ рдирдпрд╛ рдЦреЛрд▓реВрдВрдЧрд╛ред рдореИрдВ рд╕рд╣рдордд рд╣реВрдБ; рдореЗрд░рд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ 200+ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдВрднрд╛рд▓ рдирд╣реАрдВ рд╕рдХрддрд╛ рд╣реИред

@karelz рдореИрдВрдиреЗ рдПрдХ рд░реЛрдбрд╝рд╛ рдорд╛рд░рд╛; рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╡рд┐рдЪрд╛рд░рд╛рдзреАрди рдкреАрдЖрд░ рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП ref this рд░рд┐рдЯрд░реНрди рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рдерд╛ред ref this рдХреЛ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрд╕ рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ; рдпрд╣рд╛рдБ рджреЗрдЦреЗрдВ рдХреНрдпреЛрдВред рдЗрд╕рд▓рд┐рдП рд░реЗрдл-рд░рд┐рдЯрд░реНрдирд┐рдВрдЧ рд╕рдордЭреМрддрд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

рд╡реИрд╕реЗ рднреА, рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрдВрдж рдХрд░ рджреВрдВрдЧрд╛ред рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рдПрдХ рдФрд░ рдореБрджреНрджрд╛ рдЦреЛрд▓рд╛ рд╣реИ: https://github.com/dotnet/corefx/issues/14354

рдПрдХ рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐ рдкреЛрд╕реНрдЯ https://github.com/dotnet/roslyn/pull/15650 рд╕реЗ рд░реЗрдлрд░реА "рдпрд╣" рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕реА # рд╡реАрдиреЗрдХреНрд╕реНрдЯ ...

@рдмреЗрдирд╛рджрдореНрд╕

рдПрдХ рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐ рдкреЛрд╕реНрдЯ рдбреЙрдЯрдиреЗрдЯ/рд░реЛрд╕рд▓рд┐рди # 15650 рд╕реЗ рд░реЗрдлрд░реА "рдпрд╣" рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕реА # рд╡реАрдиреЗрдХреНрд╕реНрдЯ ...

рд╕рд╣реАред ref this рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╡рд┐рдзрд┐ рд╕реЗ this рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрд░рдЪрдирд╛ рдЙрджрд╛рд╣рд░рдг рд╡рд┐рдзрд┐ рд╕реЗ this рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЬреАрд╡рди рднрд░ рдХреЗ рд╡рд┐рд╡рд░рдг рд╣реИрдВ :(

@redknightlois

рдЕрдЧрд░ рд╣рдо рд╕рдЦреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдПрдХрдорд╛рддреНрд░ рд╣реИрд╢ uint рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕реЗ рдПрдХ рдирд┐рд░реАрдХреНрд╖рдг рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдврд╛рдВрдЪрд╛ рдЙрд╕ рдкреНрд░рдХрд╛рд╢ рдХреЗ рддрд╣рдд int рд▓реМрдЯрд╛рддрд╛ рд╣реИред

рд╕реАрдПрд▓рдПрд╕-рдЕрдиреБрдкрд╛рд▓рди? рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдкреВрд░реНрдгрд╛рдВрдХ рд╕реАрдПрд▓рдПрд╕-рдЕрдиреБрдкрд╛рд▓рди рдирд╣реАрдВ рд╣реИрдВред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

nalywa picture nalywa  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

sahithreddyk picture sahithreddyk  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

EgorBo picture EgorBo  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jzabroski picture jzabroski  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

matty-hall picture matty-hall  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ