File: Symbols\AnonymousTypes\CRC32.vb
Web Access
Project: src\src\Compilers\VisualBasic\Portable\Microsoft.CodeAnalysis.VisualBasic.vbproj (Microsoft.CodeAnalysis.VisualBasic)
' Licensed to the .NET Foundation under one or more agreements.
' The .NET Foundation licenses this file to you under the MIT license.
' See the LICENSE file in the project root for more information.
 
Imports System.Runtime.InteropServices
 
Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols
 
    ''' <summary> 
    ''' Module implements Dev11 class CRC32 used in anonymous type GetHashCode implementation
    ''' See [...\Language\Shared\crc32.cpp] for details
    ''' </summary>
    Friend Module CRC32
 
        Public Function ComputeCRC32(names() As String) As UInt32
            Debug.Assert(names.Length > 0)
            Dim crc32 As UInt32 = &HFFFFFFFF
 
            For Each name In names
                crc32 = Crc32Update(crc32, s_encoding.GetBytes(CaseInsensitiveComparison.ToLower(name)))
            Next
 
            Return crc32
        End Function
 
        Private Function Crc32Update(crc32 As UInt32, bytes() As Byte) As UInt32
            For Each b In bytes
                crc32 = s_CRC32_LOOKUP_TABLE(CByte(crc32) Xor b) Xor (crc32 >> 8)
            Next
            Return crc32
        End Function
 
        ''' <summary>
        ''' This is actually calculating the reverse CRC
        ''' computing the reverse CRC of 0 gives the table entry above
        ''' </summary>
        Private Function CalcEntry(crc As UInt32) As UInt32
            For i = 0 To 7
                If (crc And 1) <> 0 Then
                    crc = (crc >> 1) Xor s_CRC32_poly
                Else
                    crc >>= 1
                End If
            Next
            Return crc
        End Function
 
        Private Function InitCrc32Table() As UInt32()
            Dim table(255) As UInt32
            For i As UInteger = 0 To 255
                Dim entry As UInt32 = CalcEntry(i)
                table(CInt(i)) = entry
            Next
            Return table
        End Function
 
        Private ReadOnly s_CRC32_LOOKUP_TABLE As UInt32() = InitCrc32Table()
        Private Const s_CRC32_poly As UInt32 = &HEDB88320
        Private ReadOnly s_encoding As New System.Text.UnicodeEncoding(False, False)
 
    End Module
 
End Namespace