Converting System.Decimal to System.Guid

前端 未结 4 1333
南笙
南笙 2020-12-06 11:35

I have a big dictionary where the key is decimal, but the GetHashCode() of System.Decimal is disasterously bad. To prove my guess, I ran a for loop with 100.000 neigboring d

4条回答
  •  天命终不由人
    2020-12-06 12:09

    EXTREMELY HACKY SOLUTION (but probably fastest possible)

    public static class Utils
    {
        [StructLayout(LayoutKind.Explicit)]
        struct DecimalGuidConverter
        {
            [FieldOffset(0)]
            public decimal Decimal;
            [FieldOffset(0)]
            public Guid Guid;
        }
    
        private static DecimalGuidConverter _converter;
        public static Guid DecimalToGuid(decimal dec)
        {
            _converter.Decimal = dec;
            return _converter.Guid;
        }
        public static decimal GuidToDecimal(Guid guid)
        {
            _converter.Guid = guid;
            return _converter.Decimal;
        }
    }
    

    // Prints 000e0000-0000-0000-8324-6ae7b91d0100
    Console.WriteLine(Utils.DecimalToGuid((decimal) Math.PI));
    
    // Prints 00000000-0000-0000-1821-000000000000
    Console.WriteLine(Utils.DecimalToGuid(8472m));
    
    // Prints 8472
    Console.WriteLine(Utils.GuidToDecimal(Guid.Parse("00000000-0000-0000-1821-000000000000")));
    

提交回复
热议问题