Search

decimal.GetHashCode() delivers different hash codes depending on number of decimal places by Axel Eckenberger

Resolved
as Won't Fix Help for as Won't Fix

1
0
Sign in
to vote
Type: Bug
ID: 776203
Opened: 1/10/2013 1:32:02 AM
Access Restriction: Public
1
Workaround(s)
0
User(s) can reproduce this bug
The method GetHashCode of the decimal value type returns differen hash codes depending on the number left to the decimal point. The error occurrs only when specifying decimal digits up to the allowable maximum for the given value.

The bug causes a problem when using decimals ask key for dictionaries or in the calculation of a combined hash key.

The problem exists in the .Net Framworks 2 - 4.5.
Details (expand)

Visual Studio/Team Foundation Server/.NET Framework Tooling Version

.NET Framework 4.5

Steps to reproduce

var data = new decimal[] {
//    123456789012345678901234567890
    1.0m,
    1.00m,
    1.000m,
    1.0000m,
    1.00000m,
    1.000000m,
    1.0000000m,
    1.00000000m,
    1.000000000m,
    1.0000000000m,
    1.00000000000m,
    1.000000000000m,
    1.0000000000000m,
    1.00000000000000m,
    1.000000000000000m,
    1.0000000000000000m,
    1.00000000000000000m,
    1.000000000000000000m,
    1.0000000000000000000m,
    1.00000000000000000000m,
    1.000000000000000000000m,
    1.0000000000000000000000m,
    1.00000000000000000000000m,
    1.000000000000000000000000m,
    1.0000000000000000000000000m,
    1.00000000000000000000000000m,
    1.000000000000000000000000000m,
    1.0000000000000000000000000000m,
    1.00000000000000000000000000000m,
    1.000000000000000000000000000000m,
    1.0000000000000000000000000000000m,
    1.00000000000000000000000000000000m,
    1.000000000000000000000000000000000m,
    1.0000000000000000000000000000000000m,
};

for (int i = 0; i < 1000; ++i)
{
    var d0 = i * data[0];
    var d0Hash = d0.GetHashCode();
    foreach (var d in data)
    {
        var value = i * d;
        var hash = value.GetHashCode();
        Console.WriteLine("{0};{1};{2};{3};{4};{5}", d0, value, (d0 == value), d0Hash, hash, d0Hash == hash);
    }
}

Product Language

English

Operating System

Windows 7 SP1

Operating System Language

German

Actual results

// for i = 1000
1000,0;1000,0;True;1083129856;1083129856;True
1000,0;1000,00;True;1083129856;1083129856;True
1000,0;1000,000;True;1083129856;1083129856;True
1000,0;1000,0000;True;1083129856;1083129856;True
1000,0;1000,00000;True;1083129856;1083129856;True
1000,0;1000,000000;True;1083129856;1083129856;True
1000,0;1000,0000000;True;1083129856;1083129856;True
1000,0;1000,00000000;True;1083129856;1083129856;True
1000,0;1000,000000000;True;1083129856;1083129856;True
1000,0;1000,0000000000;True;1083129856;1083129856;True
1000,0;1000,00000000000;True;1083129856;1083129856;True
1000,0;1000,000000000000;True;1083129856;1083129856;True
1000,0;1000,0000000000000;True;1083129856;1083129856;True
1000,0;1000,00000000000000;True;1083129856;1083129856;True
1000,0;1000,000000000000000;True;1083129856;1083129856;True
1000,0;1000,0000000000000000;True;1083129856;1083129856;True
1000,0;1000,00000000000000000;True;1083129856;1083129856;True
1000,0;1000,000000000000000000;True;1083129856;1083129856;True
1000,0;1000,0000000000000000000;True;1083129856;1083129856;True
1000,0;1000,00000000000000000000;True;1083129856;-1083129841;False
1000,0;1000,000000000000000000000;True;1083129856;1083129856;True
1000,0;1000,0000000000000000000000;True;1083129856;1083129856;True
1000,0;1000,00000000000000000000000;True;1083129856;1083129856;True
1000,0;1000,000000000000000000000000;True;1083129856;1083129856;True
1000,0;1000,0000000000000000000000000;True;1083129856;-1083129841;False
1000,0;1000,0000000000000000000000000;True;1083129856;-1083129841;False
1000,0;1000,0000000000000000000000000;True;1083129856;-1083129841;False
1000,0;1000,0000000000000000000000000;True;1083129856;-1083129841;False
1000,0;1000,0000000000000000000000000;True;1083129856;-1083129841;False
1000,0;1000,0000000000000000000000000;True;1083129856;-1083129841;False
1000,0;1000,0000000000000000000000000;True;1083129856;-1083129841;False
1000,0;1000,0000000000000000000000000;True;1083129856;-1083129841;False
1000,0;1000,0000000000000000000000000;True;1083129856;-1083129841;False
1000,0;1000,0000000000000000000000000;True;1083129856;-1083129841;False

Expected results

// for i = 1000
1000,0;1000,0;True;1083129856;1083129856;True
1000,0;1000,00;True;1083129856;1083129856;True
1000,0;1000,000;True;1083129856;1083129856;True
1000,0;1000,0000;True;1083129856;1083129856;True
1000,0;1000,00000;True;1083129856;1083129856;True
1000,0;1000,000000;True;1083129856;1083129856;True
1000,0;1000,0000000;True;1083129856;1083129856;True
1000,0;1000,00000000;True;1083129856;1083129856;True
1000,0;1000,000000000;True;1083129856;1083129856;True
1000,0;1000,0000000000;True;1083129856;1083129856;True
1000,0;1000,00000000000;True;1083129856;1083129856;True
1000,0;1000,000000000000;True;1083129856;1083129856;True
1000,0;1000,0000000000000;True;1083129856;1083129856;True
1000,0;1000,00000000000000;True;1083129856;1083129856;True
1000,0;1000,000000000000000;True;1083129856;1083129856;True
1000,0;1000,0000000000000000;True;1083129856;1083129856;True
1000,0;1000,00000000000000000;True;1083129856;1083129856;True
1000,0;1000,000000000000000000;True;1083129856;1083129856;True
1000,0;1000,0000000000000000000;True;1083129856;1083129856;True
1000,0;1000,00000000000000000000;True;1083129856;-1083129841;False
1000,0;1000,000000000000000000000;True;1083129856;1083129856;True
1000,0;1000,0000000000000000000000;True;1083129856;1083129856;True
1000,0;1000,00000000000000000000000;True;1083129856;1083129856;True
1000,0;1000,000000000000000000000000;True;1083129856;1083129856;True
1000,0;1000,0000000000000000000000000;True;1083129856;1083129856;False
1000,0;1000,0000000000000000000000000;True;1083129856;1083129856;False
1000,0;1000,0000000000000000000000000;True;1083129856;1083129856;False
1000,0;1000,0000000000000000000000000;True;1083129856;1083129856;False
1000,0;1000,0000000000000000000000000;True;1083129856;1083129856;False
1000,0;1000,0000000000000000000000000;True;1083129856;1083129856;False
1000,0;1000,0000000000000000000000000;True;1083129856;1083129856;False
1000,0;1000,0000000000000000000000000;True;1083129856;1083129856;False
1000,0;1000,0000000000000000000000000;True;1083129856;1083129856;False
1000,0;1000,0000000000000000000000000;True;1083129856;1083129856;False
File Attachments
0 attachments
Sign in to post a comment.
Posted by Microsoft on 1/10/2013 at 9:24 PM
Thanks for your feedback.

We are rerouting this issue to the appropriate group within the Visual Studio Product Team for triage and resolution. These specialized experts will follow-up with your issue.
Posted by Microsoft on 1/10/2013 at 1:55 AM
Thank you for your feedback, we are currently reviewing the issue you have submitted. If this issue is urgent, please contact support directly(http://support.microsoft.com)
Sign in to post a workaround.
Posted by Axel Eckenberger on 1/10/2013 at 1:33 AM
Reduce the numbe of decimal places to a safe numer, e.g. by using round(value, precision).