【VB.NET】一个全能的哈希校验类 ClsoHash
.NET 内置了许多校验算法,却唯独不支持CRC32。
然而某些程序所生成的校验码是CRC32(比如ZIP、RAR、7Z等压缩格式),所以我们仍需要使用CRC32来校验数据的完整性。
我所分享的这个哈希类不仅有CRC32算法,还拥有许多CRC变种算法,比如CRC64、StrangeCRC、Adler32等等……
当然,也集成了.net本身就拥有的校验算法,全部打包在了一起。
除此之外,我还添加了一些数据加盐、文本转换等实用功能,应该足够一般状况下来使用了。
详细代码如下:
然而某些程序所生成的校验码是CRC32(比如ZIP、RAR、7Z等压缩格式),所以我们仍需要使用CRC32来校验数据的完整性。
我所分享的这个哈希类不仅有CRC32算法,还拥有许多CRC变种算法,比如CRC64、StrangeCRC、Adler32等等……
当然,也集成了.net本身就拥有的校验算法,全部打包在了一起。
除此之外,我还添加了一些数据加盐、文本转换等实用功能,应该足够一般状况下来使用了。
详细代码如下:
Imports System.Security.Cryptography
Imports System.Text
''' <summary>计算哈希校验值,本类型内方法仅供小型计算</summary>
Public NotInheritable Class ClsoHash
Private Sub New()
End Sub
' CRC32 算法
Shared Function CRC32(ByVal data() As Byte) As UInt32
Static crc As UInt32, crctbl(255) As UInt32
If data.Length = 0 Then Return 0
If crc = 0 Then
For i As Short = 0 To 255
crc = i
For j As Byte = 0 To 7
If crc And 1 Then crc = (crc >> 1) Xor &HEDB88320& Else crc >>= 1
Next
crctbl(i) = crc
Next
crc = 1
End If
Dim ret As UInt32 = UInt32.MaxValue
For Each b As Byte In data
b = b Xor (ret And &HFF)
ret >>= 8
ret = ret Xor crctbl(b)
Next
Return Not ret
End Function
' CRC64 算法
Shared Function CRC64(ByVal data() As Byte) As UInt64
Dim crc As ULong = &HFFFFFFFFFFFFFFFFUL
Dim i As Integer = 0
While i < data.Length
Dim tableIndex As UInteger = ((CType((crc >> 56), UInteger)) Xor data(i)) And &HFF
crc = s_CRC64Table(tableIndex) Xor (crc << 8)
System.Math.Max(System.Threading.Interlocked.Increment(i), i - 1)
End While
Return (crc Xor &HFFFFFFFFFFFFFFFFUL)
End Function
Private Shared s_CRC64Table As UInt64() = New UInt64(255) {0UL, 4823603603198064275UL, 9647207206396128550UL, 14344283933443513269UL, 5274672035359026399UL, 847670339082705484UL, 14759040976900489721UL, 10241823793177474922UL, 10549344070718052798UL, 15030250704074698541UL, 1695340678165410968UL, 6158653484774949387UL, 15804726273676621153UL, 11071337880091427826UL, 6824194888265062471UL, 2036903512645398228UL, 7367177604490692079UL, 2651944067726553980UL, 16419204125234161865UL, 11613757334439845466UL, 3390681356330821936UL, 7926053118503640995UL, 12317306969549898774UL, 16726154088988619397UL, 17607865585094646865UL, 13162708473643690690UL, 8194994013375312247UL, 3695931686473304036UL, 13648389776530124942UL, 18417527692557321757UL, 4073807025290796456UL, 8825348881154370363UL, 14734355208981384158UL, 10271039580541631821UL, 5303888135453107960UL, 822984195088142443UL, 9604374506261047041UL, 14391664176758772114UL, 47380625301539367UL, 4780770595170139316UL, 6781362712661643872UL, 2084283301222999283UL, 15852106237007281990UL, 11028505464239851989UL, 1670654249350217407UL, 6187869865390245932UL, 10578560694269006745UL, 15005564104267687178UL, 12269926345859042865UL, 16768987096479742114UL, 3433514057002836759UL, 7878672873577829764UL, 16389988026750624494UL, 11638443477897467005UL, 7391863372946608072UL, 2622728278751721819UL, 4044590402276644751UL, 8850035479350698268UL, 13673076206955870889UL, 18388311311405091898UL, 8147614050581592912UL, 3738764100714335683UL, 17650697762308740726UL, 13115328684529279205UL, 15709965168302367023UL, 11021966344253216700UL, 6909860770376862729UL, 2095335087373712026UL, 10607776270906215920UL, 15115916238825782115UL, 1645968390176284886UL, 6063892853452478021UL, 5216239979862816913UL, 762004938812542466UL, 14808413130408695223UL, 10336584279807992612UL, 94761250603078734UL, 4872975272980325085UL, 9561541190340278632UL, 14285852213486374907UL, 13562725425323287744UL, 18359094313119879763UL, 4168566602445998566UL, 8874722219015798645UL, 17657238303940757535UL, 13257468400305012364UL, 8136561383943382329UL, 3610266854770152362UL, 3341308498700434814UL, 7831293060043656173UL, 12375739730780491864UL, 16811819059476047563UL, 7452841817450123681UL, 2710377314828461874UL, 16324444680414493831UL, 11564384134825822740UL, 1621282580641819377UL, 6093108618008534114UL, 10636992411005044695UL, 15091230119249932612UL, 6867028114005673518UL, 2142715359940571325UL, 15757345747155659528UL, 10979133309658045851UL, 9518708972583580495UL, 14333231979791697372UL, 142141253402664553UL, 4830142882085382394UL, 14783726745893216144UL, 10365800689136969987UL, 5245456557503443638UL, 737318311902463013UL, 8089180804553289502UL, 3653099890976004493UL, 17700070958701396536UL, 13210088128275084459UL, 4139350461810230209UL, 8899408340202190162UL, 13587411233247080167UL, 18329878549100632180UL, 16295228101163185824UL, 11589070762272702515UL, 7477528201428671366UL, 2681160907110034709UL, 12328359726370364031UL, 16854651450907929836UL, 3384140715920324441UL, 7783913295349006794UL, 17796789492404876493UL, 12973186262895182430UL, 8294265019745835499UL, 3597188614796881784UL, 13819721540753725458UL, 18246723593521770113UL, 4190670174747424052UL, 8707887697765516199UL, 7249714899603402099UL, 2768808468102880224UL, 16248400991498780757UL, 11785088403942012614UL, 3291936780352569772UL, 8025325358597240639UL, 12127785706904956042UL, 16915077318774037017UL, 10432479959725633826UL, 15147713122803500977UL, 1524009877625084932UL, 6329456346323069591UL, 15705454305770282493UL, 11170082187107838830UL, 6635271944638132443UL, 2226424485906433608UL, 189522501206157468UL, 4634679410803088911UL, 9745950545960650170UL, 14245012653811987241UL, 5445476407655580739UL, 676338306971005648UL, 14876502445374089573UL, 10124960353263198198UL, 4215391513593610003UL, 8678706776937023872UL, 13790540925671641653UL, 18271444552530207910UL, 8337133204891997132UL, 3549843186494580063UL, 17749444438031597290UL, 13016054137459951737UL, 12170653315997410989UL, 16867732534171963454UL, 3244592164593781643UL, 8068192726900473112UL, 16273122767886764658UL, 11755906975779290337UL, 7220533709540304724UL, 2793530071884239303UL, 6682616997400869628UL, 2183556611878603887UL, 15662586120087312346UL, 11217427617020813641UL, 1553190491096487459UL, 6304735387851432112UL, 10407758620342516485UL, 15176894045242543510UL, 14905683634900247362UL, 10100238751092381137UL, 5420754629656923748UL, 705519735670536439UL, 9793295161182637981UL, 14202145287119436046UL, 146654890503152315UL, 4682024195942093864UL, 3242565161283638754UL, 7930564333232481137UL, 12186217236017068228UL, 17000743249723264599UL, 7335380351123765565UL, 2827240748300537774UL, 16153640314560107547UL, 11735716164790313608UL, 13734056228011347036UL, 18188291445129067215UL, 4285430719881142650UL, 8757259798139230185UL, 17846161249714921603UL, 13067947420601767440UL, 8235833358291897765UL, 3511522545606540086UL, 5387043107155988493UL, 590673871457609374UL, 14925875833148783915UL, 10219719885873843128UL, 284282506805329106UL, 4684052045342640705UL, 9660285764170764788UL, 14186579979835500391UL, 15610694155489642931UL, 11120709418076880672UL, 6720936860919424149UL, 2284857304564388358UL, 10490913115006887276UL, 15233377424362361855UL, 1474636623804926026UL, 6234696958930763481UL, 16178361609106579004UL, 11706535215248140463UL, 7306199781952008986UL, 2851961734412043657UL, 12229085463316509411UL, 16953397843693241456UL, 3195220067441434565UL, 7973432182840617302UL, 8278700923620460418UL, 3464177731752866065UL, 17798816680404380324UL, 13110814815472245815UL, 4310152537884486493UL, 8728078392784608718UL, 13704874997943502459UL, 18213013024491712744UL, 9707630858549910483UL, 14143712128616820032UL, 241414281116563189UL, 4731397450835853414UL, 14955056402857342732UL, 10194998898151653791UL, 5362321814220069418UL, 619854820462849209UL, 1503817855483314797UL, 6209975379031176446UL, 10466191297540353867UL, 15262558828106308056UL, 6768281431840648882UL, 2241989909157107745UL, 15567826590698013588UL, 11168054230320002311UL}
' StrangeCRC 算法
Shared Function StrangeCRC(ByVal data() As Byte) As UInt32
Dim crc As UInteger = UInteger.MaxValue
For i As Integer = 0 To data.Length - 1
Dim temp As Integer = (crc >> 24) Xor data(i)
If temp < 0 Then temp = 256 + temp
crc = (crc << 8) Xor s_scrc32Table(temp)
Next
Return Not crc
End Function
Private Shared s_scrc32Table As UInteger() = {0, 79764919, 159529838, 222504665, 319059676, 398814059, 445009330, 507990021, 638119352, 583659535, 797628118, 726387553, 890018660, 835552979, 1015980042, 944750013, 1276238704, 1221641927, 1167319070, 1095957929, 1595256236, 1540665371, 1452775106, 1381403509, 1780037320, 1859660671, 1671105958, 1733955601, 2031960084, 2111593891, 1889500026, 1952343757, 2552477408, 2632100695, 2443283854, 2506133561, 2334638140, 2414271883, 2191915858, 2254759653, 3190512472, 3135915759, 3081330742, 3009969537, 2905550212, 2850959411, 2762807018, 2691435357, 3560074640, 3505614887, 3719321342, 3648080713, 3342211916, 3287746299, 3467911202, 3396681109, 4063920168, 4143685023, 4223187782, 4286162673, 3779000052, 3858754371, 3904687514, 3967668269, 881225847, 809987520, 1023691545, 969234094, 662832811, 591600412, 771767749, 717299826, 311336399, 374308984, 453813921, 533576470, 25881363, 88864420, 134795389, 214552010, 2023205639, 2086057648, 1897238633, 1976864222, 1804852699, 1867694188, 1645340341, 1724971778, 1587496639, 1516133128, 1461550545, 1406951526, 1302016099, 1230646740, 1142491917, 1087903418, 2896545431, 2825181984, 2770861561, 2716262478, 3215044683, 3143675388, 3055782693, 3001194130, 2326604591, 2389456536, 2200899649, 2280525302, 2578013683, 2640855108, 2418763421, 2498394922, 3769900519, 3832873040, 3912640137, 3992402750, 4088425275, 4151408268, 4197601365, 4277358050, 3334271071, 3263032808, 3476998961, 3422541446, 3585640067, 3514407732, 3694837229, 3640369242, 1762451694, 1842216281, 1619975040, 1682949687, 2047383090, 2127137669, 1938468188, 2001449195, 1325665622, 1271206113, 1183200824, 1111960463, 1543535498, 1489069629, 1434599652, 1363369299, 622672798, 568075817, 748617968, 677256519, 907627842, 853037301, 1067152940, 995781531, 51762726, 131386257, 177728840, 240578815, 269590778, 349224269, 429104020, 491947555, 4046411278, 4126034873, 4172115296, 4234965207, 3794477266, 3874110821, 3953728444, 4016571915, 3609705398, 3555108353, 3735388376, 3664026991, 3290680682, 3236090077, 3449943556, 3378572211, 3174993278, 3120533705, 3032266256, 2961025959, 2923101090, 2868635157, 2813903052, 2742672763, 2604032198, 2683796849, 2461293480, 2524268063, 2284983834, 2364738477, 2175806836, 2238787779, 1569362073, 1498123566, 1409854455, 1355396672, 1317987909, 1246755826, 1192025387, 1137557660, 2072149281, 2135122070, 1912620623, 1992383480, 1753615357, 1816598090, 1627664531, 1707420964, 295390185, 358241886, 404320391, 483945776, 43990325, 106832002, 186451547, 266083308, 932423249, 861060070, 1041341759, 986742920, 613929101, 542559546, 756411363, 701822548, 3316196985, 3244833742, 3425377559, 3370778784, 3601682597, 3530312978, 3744426955, 3689838204, 3819031489, 3881883254, 3928223919, 4007849240, 4037393693, 4100235434, 4180117107, 4259748804, 2310601993, 2373574846, 2151335527, 2231098320, 2596047829, 2659030626, 2470359227, 2550115596, 2947551409, 2876312838, 2788305887, 2733848168, 3165939309, 3094707162, 3040238851, 2985771188}
' Adler32 算法
Shared Function Adler32(ByVal data As Byte()) As UInteger
Return Adler32(data, 0, data.Length)
End Function
Shared Function Adler32(ByVal data() As Byte, ByVal offset As Integer, ByVal count As Integer) As UInteger
Dim checksum As UInteger = 1
Const BASE As UInteger = 65521
Dim s1 As UInteger = checksum And 65535
Dim s2 As UInteger = checksum >> 16
While count > 0
Dim n As Integer = 3800
If n > count Then n = count
count -= n
While n > 0
s1 = s1 + CUInt((data(offset) And 255)) : offset += 1
s2 = s2 + s1
n -= 1
End While
s1 = s1 Mod BASE
s2 = s2 Mod BASE
End While
Return (s2 << 16) Or s1
End Function
' MD5算法
Shared Function MD5(ByVal data() As Byte) As Byte()
Return (New MD5CryptoServiceProvider).ComputeHash(data)
End Function
' MD5CSP算法
Shared Function MD5CSP(ByVal data() As Byte) As Byte()
Return (New MD5CryptoServiceProvider).ComputeHash(data)
End Function
' HMACMD5算法
Shared Function HMACMD5(ByVal data() As Byte) As Byte()
Return (New HMACMD5).ComputeHash(data)
End Function
' HMACRIPEMD160算法
Shared Function HMACRIPEMD160(ByVal data() As Byte) As Byte()
Return (New HMACRIPEMD160).ComputeHash(data)
End Function
' SHA 1、256、384、512算法
Shared Function SHA1(ByVal data() As Byte) As Byte()
Return (New SHA1Managed).ComputeHash(data)
End Function
Shared Function SHA256(ByVal data() As Byte) As Byte()
Return (New SHA256Managed).ComputeHash(data)
End Function
Shared Function SHA384(ByVal data() As Byte) As Byte()
Return (New SHA384Managed).ComputeHash(data)
End Function
Shared Function SHA512(ByVal data() As Byte) As Byte()
Return (New SHA512Managed).ComputeHash(data)
End Function
' HMACSHA 1、256、384、512算法
Shared Function HMACSHA1(ByVal data() As Byte) As Byte()
Return (New HMACSHA1).ComputeHash(data)
End Function
Shared Function HMACSHA256(ByVal data() As Byte) As Byte()
Return (New HMACSHA256).ComputeHash(data)
End Function
Shared Function HMACSHA384(ByVal data() As Byte) As Byte()
Return (New HMACSHA384).ComputeHash(data)
End Function
Shared Function HMACSHA512(ByVal data() As Byte) As Byte()
Return (New HMACSHA512).ComputeHash(data)
End Function
' RIPEMD160算法
Shared Function RIPEMD160(ByVal data() As Byte) As Byte()
Return (New RIPEMD160Managed).ComputeHash(data)
End Function
''' <summary>返回数据的字符表示</summary>
Shared Function HashToText(ByVal data() As Byte) As String
Dim sb As New System.Text.StringBuilder
For Each b As Byte In data
sb.Append(b.ToString("X2"))
Next
Return sb.ToString
End Function
''' <summary>返回数据的字符表示</summary>
Shared Function HashToText(ByVal data() As Byte, ByVal lower As Boolean) As String
Dim sb As New System.Text.StringBuilder
Dim sl As String = IIf(lower, "x2", "X2")
For Each b As Byte In data
sb.Append(b.ToString(sl))
Next
Return sb.ToString
End Function
''' <summary>返回整数的字符表示</summary>
Shared Function HashToText(ByVal uint As UInteger) As String
Return Hex(uint)
End Function
''' <summary>返回整数的字符表示</summary>
Shared Function HashToText(ByVal int As Integer) As String
Return Hex(int)
End Function
Shared Function HashToText(ByVal int As UInt64) As String
Return Hex(int)
End Function
Shared Function HashToText(ByVal int As Int64) As String
Return Hex(int)
End Function
''' <summary>返回BASE64编码数据</summary>
Shared Function HashToBase64(ByVal data() As Byte) As String
Return Convert.ToBase64String(data)
End Function
''' <summary>将文本数据化</summary>
Shared Function TextToBytes(ByVal str As String, Optional ByVal enc As Encoding = Nothing) As Byte()
If enc Is Nothing Then enc = Encoding.UTF8
Return enc.GetBytes(str)
End Function
Shared Function TextToBytesAddSalt(ByVal str As String, Optional ByVal c1 As String = "", Optional ByVal c2 As String = "", Optional ByVal enc As Encoding = Nothing) As Byte()
If c1 = "" Then c1 = "ClsO"
If c2 = "" Then c2 = "hAsH"
str = c1 & str & c2
If enc Is Nothing Then enc = Encoding.UTF8
Return enc.GetBytes(str)
End Function
''' <summary>将文本加盐</summary>
Shared Function AddSaltText(ByVal str As String, Optional ByVal c1 As String = "", Optional ByVal c2 As String = "") As String
If c1 = "" Then c1 = "ClsO"
If c2 = "" Then c2 = "hAsH"
Return c1 & str & c2
End Function
''' <summary>将数据加盐</summary>
Shared Function AddSaltBytes(ByVal bs As Byte(), Optional ByVal c1 As Byte() = Nothing, Optional ByVal c2 As Byte() = Nothing) As Byte()
Dim bl As New List(Of Byte)
If c1 Is Nothing Then c1 = {67, 108, 115, 79}
If c2 Is Nothing Then c2 = {104, 65, 115, 72}
bl.AddRange(c1)
bl.AddRange(bs)
bl.AddRange(c2)
Return bl.ToArray
End Function
End Class
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。