[原]VB.NET常用的哈希算法集 差不多30種.



VB.NET常用的哈希算法集.其中包括了著名的暴雪的哈希,T33哈希.......全部是網上的 C/C++代碼改的(VB.NET的資源真的很少).
不同的哈希算法在分布式,布降過濾器,位圖MAP等等應用得比較多...

'' </summary>
Public Class MyUnchecked

#Region "UInt64"

    <StructLayout(LayoutKind.Explicit)>
    Public Structure UncheckedUInt64

        <FieldOffset(0)>
        Private longValue As UInt64
        <FieldOffset(0)>
        Private intValueLo As UInt32
        <FieldOffset(4)>
        Private intValueHi As UInt32 '//

        Private Sub New(newLongValue As UInt64)
            longValue = newLongValue
        End Sub

        Public Overloads Shared Widening Operator CType(value As UInt64) As UncheckedUInt64
            Return New UncheckedUInt64(value)
        End Operator

        Public Overloads Shared Widening Operator CType(value As UncheckedUInt64) As UInt64
            Return value.longValue
        End Operator

        Public Overloads Shared Operator *(x As UncheckedUInt64, y As UInt64) As UncheckedUInt64
            Return New UncheckedUInt64(x.longValue * y)
        End Operator

        Public Overloads Shared Operator /(x As UncheckedUInt64, y As UInt64) As UncheckedUInt64
            Return New UncheckedUInt64(x.longValue / y)
        End Operator

        Public Overloads Shared Operator ^(x As UncheckedUInt64, y As Double) As UncheckedUInt64
            Return New UncheckedUInt64(x.longValue ^ y)
        End Operator

        Public Overloads Shared Operator ^(x As UncheckedUInt64, y As UInt32) As UncheckedUInt64
            Return New UncheckedUInt64(MyConvert.MyPower(x.longValue, y))
        End Operator

        Public Overloads Shared Operator Xor(x As UncheckedUInt64, y As UInt64) As UncheckedUInt64
            Return New UncheckedUInt64(x.longValue Xor y)
        End Operator

        Public Overloads Shared Operator +(x As UncheckedUInt64, y As UInt64) As UncheckedUInt64
            Return New UncheckedUInt64(x.longValue + y)
        End Operator

        Public Overloads Shared Operator -(x As UncheckedUInt64, y As UInt64) As UncheckedUInt64
            Return New UncheckedUInt64(x.longValue - y)
        End Operator

        Public Overloads Shared Operator <<(x As UncheckedUInt64, y As Int32) As UncheckedUInt64
            Return New UncheckedUInt64(x.longValue << y)
        End Operator

        Public Overloads Shared Operator >>(x As UncheckedUInt64, y As Int32) As UncheckedUInt64
            Return New UncheckedUInt64(x.longValue >> y)
        End Operator

        Public Overloads Shared Operator And(x As UncheckedUInt64, y As UInt64) As UncheckedUInt64
            Return New UncheckedUInt64(x.longValue And y)
        End Operator

        Public Overloads Shared Operator =(x As UncheckedUInt64, y As UInt64) As UncheckedUInt64
            Return New UncheckedUInt64(x.longValue)
        End Operator

        Public Overloads Shared Operator <>(x As UncheckedUInt64, y As UInt64) As UncheckedUInt64
            Return New UncheckedUInt64(x.longValue <> y)
        End Operator

        Public Overloads Shared Operator Not(x As UncheckedUInt64) As UncheckedUInt64
            Return New UncheckedUInt64(Not x.longValue)
        End Operator

    End Structure

#End Region
End Class

24 个解决方案

#1



#Region "哈希算法"


    ''' <summary>
    ''' 和 HashCMyMap 基本一樣.
    ''' </summary>
    ''' <param name="Key"></param>
    ''' <returns></returns>
    Public Shared Function HashDJB(Key As String) As UInt64
        Dim hash As MyUnchecked.UncheckedUInt64 = 5381
        Dim L As Int32 = Key.Length - 1
        Dim KeyCharArr() As Char = Key.ToArray

        For i As Int32 = 0 To L
            hash = ((hash << 5) + hash) + Asc(KeyCharArr(i)) + 3
        Next

        Return hash

    End Function

    ''' <summary>
    ''' 和 HashCMyMap 基本一樣.
    ''' </summary>
    ''' <param name="KeyByte"></param>
    ''' <returns></returns>
    Public Shared Function HashDJB(ByVal KeyByte() As Byte) As UInt64
        Dim hash As MyUnchecked.UncheckedUInt64 = 5381
        Dim L As Int32 = KeyByte.Length - 1

        For i As Int32 = 0 To L
            hash = ((hash << 5) + hash) + KeyByte(i) + 3
        Next

        Return hash

    End Function

    ''' <summary>
    ''' BKDR 哈希
    ''' </summary>
    ''' <param name="Key"></param>
    ''' <param name="seed">種子.最好是使用質數.</param>
    ''' <returns></returns>
    Public Shared Function HashBKDR(ByVal Key As String,
                                    Optional seed As Long = 131) As UInt64
        Dim hash As MyUnchecked.UncheckedUInt64 = 0
        Dim L As Int32 = Key.Length - 1
        Dim KeyCharArr() As Char = Key.ToArray
        For i As Int32 = 0 To L - 1
            hash = (hash * seed) + Asc(KeyCharArr(i)) + 3
        Next

        Return (hash And &H7FFFFFFF)

    End Function

    ''' <summary>
    ''' BKDR 哈希
    ''' </summary>
    ''' <param name="KeyByte"></param>
    ''' <param name="seed">種子數</param>
    ''' <returns></returns>
    Public Shared Function HashBKDR(ByVal KeyByte() As Byte,
                                    Optional seed As Long = 131) As UInt64
        Dim hash As MyUnchecked.UncheckedUInt64 = 0
        Dim L As Int32 = KeyByte.Length - 1
        For i As Int32 = 0 To L - 1
            hash = (hash * seed) + KeyByte(i) + 3
        Next

        Return (hash And &H7FFFFFFF)

    End Function

    Public Shared Function HashRS(Key As String,
                                  Optional seed As Long = 131) As UInt64
        Dim hash As MyUnchecked.UncheckedUInt64 = 0
        Dim b As UInt64 = 378551
        Dim a As UInt64 = 63689
        Dim L As Int32 = Key.Length - 1
        Dim KeyCharArr() As Char = Key.ToArray
        For i As Int32 = 0 To L - 1
            hash = (hash * a) + Asc(KeyCharArr(i))
            a = a * b
        Next

        Return (hash And &H7FFFFFFF)

    End Function

    Public Shared Function HashRS(KeyByte() As Byte,
                                  Optional seed As Long = 131) As UInt64
        Dim hash As MyUnchecked.UncheckedUInt64 = 0
        Dim b As UInt64 = 378551
        Dim a As UInt64 = 63689
        Dim L As Int32 = KeyByte.Length - 1

        For i As Int32 = 0 To L - 1
            hash = (hash * a) + KeyByte(i)
            a = a * b
        Next

        Return (hash And &H7FFFFFFF)

    End Function

#2



    Public Shared Function HashSDBM(Key As String) As UInt64

        Dim hash As MyUnchecked.UncheckedUInt64 = 0
        Dim L As Int32 = Key.Length - 1
        Dim KeyCharArr() As Char = Key.ToArray
        For i As Int32 = 0 To L - 1
            hash = Asc(KeyCharArr(i)) + (hash << 6) + (hash << 16) - hash
        Next

        Return (hash And &H7FFFFFFF)

    End Function

    Public Shared Function HashSDBM(KeyByte() As Byte) As UInt64

        Dim hash As MyUnchecked.UncheckedUInt64 = 0
        Dim L As Int32 = KeyByte.Length - 1

        For i As Int32 = 0 To L - 1
            hash = KeyByte(i) + (hash << 6) + (hash << 16) - hash
        Next

        Return (hash And &H7FFFFFFF)

    End Function


    Public Shared Function HashJS(Key As String) As UInt64
        Dim hash As MyUnchecked.UncheckedUInt64 = 1315423911
        Dim L As Int32 = Key.Length - 1
        Dim KeyCharArr() As Char = Key.ToArray
        For i As Int32 = 0 To L - 1
            hash = hash Xor (((hash << 5) + Asc(KeyCharArr(i)) + (hash >> 2)))
        Next
        Return hash
    End Function

    Public Shared Function HashJS(KeyByte() As Byte) As UInt64
        Dim hash As MyUnchecked.UncheckedUInt64 = 1315423911
        Dim L As Int32 = KeyByte.Length - 1

        For i As Int32 = 0 To L - 1
            hash = hash Xor (((hash << 5) + KeyByte(i) + (hash >> 2)))
        Next
        Return hash
    End Function

    Public Shared Function HashPJW(Key As String) As UInt64

        Dim BitsInUnsignedInt As UInt64 = CLng(4 * 8)
        Dim ThreeQuarters As UInt64 = CLng((BitsInUnsignedInt * 3) / 4)
        Dim OneEighth As UInt64 = CLng(BitsInUnsignedInt / 8)
        Dim HighBits As UInt64 = CLng(&HFFFFFFFF) << (BitsInUnsignedInt - OneEighth)
        Dim hash As MyUnchecked.UncheckedUInt64 = 0
        Dim test As UInt64 = 0
        Dim L As Int32 = Key.Length - 1
        Dim KeyCharArr() As Char = Key.ToArray

        For I As Int32 = 0 To L
            hash = (hash << OneEighth) + Asc(KeyCharArr(I))
            If ((test = hash And HighBits) <> 0) Then
                hash = ((hash Xor (test >> ThreeQuarters)) And (Not HighBits))
            End If

        Next

        Return hash

    End Function

    Public Shared Function HashPJW(KeyByte() As Byte) As UInt64

        Dim BitsInUnsignedInt As UInt64 = CLng(4 * 8)
        Dim ThreeQuarters As UInt64 = CLng((BitsInUnsignedInt * 3) / 4)
        Dim OneEighth As UInt64 = CLng(BitsInUnsignedInt / 8)
        Dim HighBits As UInt64 = CLng(&HFFFFFFFF) << (BitsInUnsignedInt - OneEighth)
        Dim hash As MyUnchecked.UncheckedUInt64 = 0
        Dim test As UInt64 = 0
        Dim L As Int32 = KeyByte.Length - 1

        For I As Int32 = 0 To L
            hash = (hash << OneEighth) + KeyByte(I)
            If ((test = hash And HighBits) <> 0) Then
                hash = ((hash Xor (test >> ThreeQuarters)) And (Not HighBits))
            End If

        Next

        Return hash

    End Function

    Public Shared Function HashAP(Key As String) As UInt64

        Dim hash As MyUnchecked.UncheckedUInt64 = &HAAAAAAAA
        Dim L As Int32 = Key.Length - 1
        Dim KeyCharArr() As Char = Key.ToArray
        For i As Int32 = 0 To L
            If ((i And 1) = 0) Then
                hash = hash Xor (((hash << 7) Xor Asc(KeyCharArr(i)) * (hash >> 3)))
            Else
                hash = hash Xor ((Not ((hash << 11) + Asc(KeyCharArr(i)) Xor (hash >> 5))))
            End If
        Next

        Return hash

    End Function

    Public Shared Function HashAP(KeyByte() As Byte) As UInt64

        Dim hash As MyUnchecked.UncheckedUInt64 = &HAAAAAAAA
        Dim L As Int32 = KeyByte.Length - 1

        For i As Int32 = 0 To L
            If ((i And 1) = 0) Then
                hash = hash Xor (((hash << 7) Xor KeyByte(i) * (hash >> 3)))
            Else
                hash = hash Xor ((Not ((hash << 11) + KeyByte(i) Xor (hash >> 5))))
            End If
        Next
        Return hash

    End Function

    Public Shared Function HashDEK(Key As String) As UInt64

        Dim L As Int32 = Key.Length - 1
        Dim KeyCharArr() As Char = Key.ToArray
        Dim hash As MyUnchecked.UncheckedUInt64 = L + 1
        For i As Int32 = 0 To L
            hash = ((hash << 5) Xor (hash >> 27)) Xor Asc(KeyCharArr(i))
        Next
        Return hash

    End Function


    Public Shared Function HashDEK(KeyByte() As Byte) As UInt64

        Dim L As Int32 = KeyByte.Length - 1
        Dim hash As MyUnchecked.UncheckedUInt64 = L + 1
        For i As Int32 = 0 To L
            hash = ((hash << 5) Xor (hash >> 27)) Xor KeyByte(i)
        Next
        Return hash

    End Function

    Public Shared Function HashELF(Key As String) As UInt64

        Dim L As Int32 = Key.Length - 1
        Dim KeyCharArr() As Char = Key.ToArray
        Dim hash As MyUnchecked.UncheckedUInt64 = 0
        Dim x As Long = 0
        For i As Int32 = 0 To L
            hash = (hash << 4) + Asc(KeyCharArr(i))
            x = hash And &HF0000000L
            If x <> 0 Then
                hash = hash Xor (x >> 24)
            End If
            hash = hash And (Not x)
        Next
        Return hash

    End Function

    Public Shared Function HashELF(KeyByte() As Byte) As UInt64

        Dim L As Int32 = KeyByte.Length - 1
        Dim hash As MyUnchecked.UncheckedUInt64 = 0
        Dim x As Long = 0
        For i As Int32 = 0 To L
            hash = (hash << 4) + KeyByte(i)
            x = hash And &HF0000000L
            If x <> 0 Then
                hash = hash Xor (x >> 24)
            End If
            hash = hash And (Not x)
        Next

        Return hash

    End Function


    Private Shared cryptTable(&H100 * 5 - 1) As UInt64
    Private Shared IsInitcryptTable As Boolean = False
    Public Shared Sub HashBlizzardInit()

        Dim seed As UInt64 = &H100001
        Dim index1 As UInt64 = 0
        Dim index2 As UInt64 = 0
        Dim I As UInt64
        Dim KKK As UInt64 = 0
        For index1 = 0 To &H100 - 1
            index2 = index1
            For I = 0 To 4
                Dim temp1, temp2 As UInt64
                seed = (seed * 125 + 3) Mod &H2AAAAB
                temp1 = (seed And &HFFFF) << &H10
                seed = (seed * 125 + 3) Mod &H2AAAAB
                temp2 = (seed And &HFFFF)
                cryptTable(index2) = (temp1 Or temp2) '//|
                index2 += &H100
            Next
        Next

        IsInitcryptTable = True

    End Sub

    ''' <summary>
    ''' 暴雪公司出名的哈希碼.
    ''' 測試了 二千萬 GUID, 沒有重復.但運算量比較大。
    ''' </summary>
    ''' <param name="key"></param>
    ''' <param name="HasType">HasType =0 ,1 ,2 </param>
    ''' <returns></returns>
    Public Shared Function HashBlizzard(ByVal Key As String,
                                        Optional HasType As Long = 0) As UInt64

        If IsInitcryptTable = False Then HashBlizzardInit()

        Dim L As Int32 = Key.Length - 1
        Dim KeyCharArr() As Char = Key.ToArray
        Dim seed1 As MyUnchecked.UncheckedUInt64 = &H7FED7FED
        Dim seed2 As MyUnchecked.UncheckedUInt64 = &HEEEEEEEE
        Dim LoopID As Int32 = 0
        While (LoopID < L)
            Dim ascCode As Int32 = Asc(KeyCharArr(LoopID))
            seed1 = cryptTable((HasType << 8) + ascCode) Xor (seed1 + seed2)
            seed2 = ascCode + seed1 + seed2 + (seed2 << 5) + 3
            LoopID += 1
        End While

        Return seed1

    End Function

    ''' <summary>
    ''' 暴雪公司著名的 HashMap .
    ''' 測試了 二千萬 GUID, 沒有重復.但運算量比較大。
    ''' </summary>
    ''' <param name="KeyByte"></param>
    ''' <param name="HasType">HasType =[0 ,1 ,2] </param>
    ''' <returns></returns>
    Public Shared Function HashBlizzard(KeyByte() As Byte,
                                        Optional HasType As Long = 0) As UInt64

        If IsInitcryptTable = False Then HashBlizzardInit()

        Dim L As Int32 = KeyByte.Length - 1
        Dim seed1 As MyUnchecked.UncheckedUInt64 = &H7FED7FED
        Dim seed2 As MyUnchecked.UncheckedUInt64 = &HEEEEEEEE
        Dim LoopID As Int32 = 0
        While (LoopID < L)
            Dim ascCode As Int32 = KeyByte(LoopID)
            seed1 = cryptTable((HasType << 8) + ascCode) Xor (seed1 + seed2)
            seed2 = ascCode + seed1 + seed2 + (seed2 << 5) + 3
            LoopID += 1
        End While

        Return seed1

    End Function

#3



    ''' <summary>
    ''' 經典times33算法。簡單高效。[這個使用移位代替*33]
    ''' 測試一千萬。沒有重復哈希值。
    ''' </summary>
    ''' <param name="Key"></param>
    ''' <returns></returns>
    Public Shared Function HashCMyMap(Key As String) As UInt64

        Dim nHash As MyUnchecked.UncheckedUInt64 = 0
        Dim L As Int32 = Key.Length - 1
        Dim KeyCharArr() As Char = Key.ToArray
        Dim I As Int32 = 0

        While (I < L)
            nHash = (nHash << 5) + nHash + Asc(KeyCharArr(I)) + 3
            I += 1
        End While

        Return nHash

    End Function


    ''' <summary>
    ''' 經典times33算法。簡單高效。[這個使用移位代替*33]
    ''' 測試一千萬。沒有重復哈希值。
    ''' </summary>
    ''' <param name="KeyByte"></param>
    ''' <returns></returns>
    Public Shared Function HashCMyMap(KeyByte() As Byte) As UInt64

        Dim nHash As MyUnchecked.UncheckedUInt64 = 0
        Dim L As Int32 = KeyByte.Length - 1
        Dim I As Int32 = 0

        While (I < L)
            nHash = (nHash << 5) + nHash + KeyByte(I) + 3
            I += 1
        End While

        Return nHash

    End Function


    ''' <summary>
    ''' 經典的Time算法。簡單,高效。
    ''' Ngix使用的是 time31,Tokyo Cabinet使用的是 time37
    ''' 小寫英文詞匯適合33, 大小寫混合使用65。time33比較適合的是英文詞匯的hash.
    ''' </summary>
    ''' <param name="Key"></param>
    ''' <param name="seed">種子數。 31,33,37 。。。</param>
    ''' <returns></returns>
    Public Shared Function HashTimeMap(Key As String,
                                       seed As Int16) As UInt64

        Dim nHash As MyUnchecked.UncheckedUInt64 = 0
        Dim L As Int32 = Key.Length - 1
        Dim KeyCharArr() As Char = Key.ToArray
        Dim I As Int32 = 0

        While (I < L)
            nHash = seed * nHash + nHash + Asc(KeyCharArr(I)) + 3
            I += 1
        End While

        Return nHash

    End Function

    ''' <summary>
    ''' 經典的Time算法。簡單,高效。
    ''' Ngix使用的是 time31,Tokyo Cabinet使用的是 time37
    ''' 小寫英文詞匯適合33, 大小寫混合使用65。time33比較適合的是英文詞匯的hash.
    ''' </summary>
    ''' <param name="KeyByte"></param>
    ''' <param name="seed">種子質數。 31,33,37 。。。</param>
    ''' <returns></returns>
    Public Shared Function HashTimeMap(KeyByte() As Byte,
                                       seed As UInt32) As UInt64

        Dim nHash As MyUnchecked.UncheckedUInt64 = 0
        Dim L As Int32 = KeyByte.Length - 1
        Dim I As Int32 = 0

        While (I < L)
            nHash = seed * nHash + nHash + KeyByte(I) + 3
            I += 1
        End While

        Return nHash

    End Function


#End Region

#4


Mark一下

#5


樓主好人,好人發大財,一生平安

#6


感謝lz的原創和分享,給推薦下

#7


該回復於2017-02-28 23:52:04被版主刪除

#8


該回復於2017-06-06 16:00:00被版主刪除

#9


該回復於2017-06-06 15:57:26被版主刪除

#10


該回復於2017-02-01 00:00:56被版主刪除

#11


該回復於2017-06-06 16:00:01被版主刪除

#12


#13


樓主牛B且心胸寬廣,贊一個!

#14


該回復於2017-06-06 15:57:26被版主刪除

#15


樓主牛B且心胸寬廣,贊一個!

#16


是俗話說的很多的

#17


學習了

#18


多謝樓主的分享.. 

#19


標注收藏,謝謝樓主

#20


不錯的分享!!!

#21


不感謝樓主行嗎?不行!必須得感謝樓主無私分享。

#22


感謝樓主無私分享。 

#23


論壇正需要你這樣的人,裝B的少一點,共享的實際代碼多一點.你這指頭輕點一下不要緊,從此中國網民百度有了哈希算法的完美資料,樓主是真的帥了

#24


不是月神推一把,這等好貼我還沒看到,月神真是一個合格的版主

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com