/CRC32.lua
Lua | 173 lines | 116 code | 21 blank | 36 comment | 9 complexity | 8d83893566c6895730d78f8d26dc3df6 MD5 | raw file
1--Copyright (c) 2007-2008 Neil Richardson (nrich@iinet.net.au) 2-- 3--Permission is hereby granted, free of charge, to any person obtaining a copy 4--of this software and associated documentation files (the "Software"), to deal 5--in the Software without restriction, including without limitation the rights 6--to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7--copies of the Software, and to permit persons to whom the Software is 8--furnished to do so, subject to the following conditions: 9-- 10--The above copyright notice and this permission notice shall be included in all 11--copies or substantial portions of the Software. 12-- 13--THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14--IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15--FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16--AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17--LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18--OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 19--IN THE SOFTWARE. 20 21module('CRC32', package.seeall) 22 23local max = 2^32 -1 24 25local CRC32 = { 26 0,79764919,159529838,222504665,319059676, 27 398814059,445009330,507990021,638119352, 28 583659535,797628118,726387553,890018660, 29 835552979,1015980042,944750013,1276238704, 30 1221641927,1167319070,1095957929,1595256236, 31 1540665371,1452775106,1381403509,1780037320, 32 1859660671,1671105958,1733955601,2031960084, 33 2111593891,1889500026,1952343757,2552477408, 34 2632100695,2443283854,2506133561,2334638140, 35 2414271883,2191915858,2254759653,3190512472, 36 3135915759,3081330742,3009969537,2905550212, 37 2850959411,2762807018,2691435357,3560074640, 38 3505614887,3719321342,3648080713,3342211916, 39 3287746299,3467911202,3396681109,4063920168, 40 4143685023,4223187782,4286162673,3779000052, 41 3858754371,3904687514,3967668269,881225847, 42 809987520,1023691545,969234094,662832811, 43 591600412,771767749,717299826,311336399, 44 374308984,453813921,533576470,25881363, 45 88864420,134795389,214552010,2023205639, 46 2086057648,1897238633,1976864222,1804852699, 47 1867694188,1645340341,1724971778,1587496639, 48 1516133128,1461550545,1406951526,1302016099, 49 1230646740,1142491917,1087903418,2896545431, 50 2825181984,2770861561,2716262478,3215044683, 51 3143675388,3055782693,3001194130,2326604591, 52 2389456536,2200899649,2280525302,2578013683, 53 2640855108,2418763421,2498394922,3769900519, 54 3832873040,3912640137,3992402750,4088425275, 55 4151408268,4197601365,4277358050,3334271071, 56 3263032808,3476998961,3422541446,3585640067, 57 3514407732,3694837229,3640369242,1762451694, 58 1842216281,1619975040,1682949687,2047383090, 59 2127137669,1938468188,2001449195,1325665622, 60 1271206113,1183200824,1111960463,1543535498, 61 1489069629,1434599652,1363369299,622672798, 62 568075817,748617968,677256519,907627842, 63 853037301,1067152940,995781531,51762726, 64 131386257,177728840,240578815,269590778, 65 349224269,429104020,491947555,4046411278, 66 4126034873,4172115296,4234965207,3794477266, 67 3874110821,3953728444,4016571915,3609705398, 68 3555108353,3735388376,3664026991,3290680682, 69 3236090077,3449943556,3378572211,3174993278, 70 3120533705,3032266256,2961025959,2923101090, 71 2868635157,2813903052,2742672763,2604032198, 72 2683796849,2461293480,2524268063,2284983834, 73 2364738477,2175806836,2238787779,1569362073, 74 1498123566,1409854455,1355396672,1317987909, 75 1246755826,1192025387,1137557660,2072149281, 76 2135122070,1912620623,1992383480,1753615357, 77 1816598090,1627664531,1707420964,295390185, 78 358241886,404320391,483945776,43990325, 79 106832002,186451547,266083308,932423249, 80 861060070,1041341759,986742920,613929101, 81 542559546,756411363,701822548,3316196985, 82 3244833742,3425377559,3370778784,3601682597, 83 3530312978,3744426955,3689838204,3819031489, 84 3881883254,3928223919,4007849240,4037393693, 85 4100235434,4180117107,4259748804,2310601993, 86 2373574846,2151335527,2231098320,2596047829, 87 2659030626,2470359227,2550115596,2947551409, 88 2876312838,2788305887,2733848168,3165939309, 89 3094707162,3040238851,2985771188, 90} 91 92local function xor(a, b) 93 local calc = 0 94 95 for i = 32, 0, -1 do 96 local val = 2 ^ i 97 local aa = false 98 local bb = false 99 100 if a == 0 then 101 calc = calc + b 102 break 103 end 104 105 if b == 0 then 106 calc = calc + a 107 break 108 end 109 110 if a >= val then 111 aa = true 112 a = a - val 113 end 114 115 if b >= val then 116 bb = true 117 b = b - val 118 end 119 120 if not (aa and bb) and (aa or bb) then 121 calc = calc + val 122 end 123 end 124 125 return calc 126end 127 128local function lshift(num, left) 129 local res = num * (2 ^ left) 130 return res % (2 ^ 32) 131end 132 133local function rshift(num, right) 134 local res = num / (2 ^ right) 135 return math.floor(res) 136end 137 138function Hash(str) 139 local count = string.len(tostring(str)) 140 local crc = max 141 142 local i = 1 143 while count > 0 do 144 local byte = string.byte(str, i) 145 146 crc = xor(lshift(crc, 8), CRC32[xor(rshift(crc, 24), byte) + 1]) 147 148 i = i + 1 149 count = count - 1 150 end 151 152 return crc 153end 154 155 156-- 157-- CRC32.lua 158-- 159-- A pure Lua implementation of a CRC32 hashing algorithm. Slower than using a C implemtation, 160-- but useful having no other dependancies. 161-- 162-- 163-- Synopsis 164-- 165-- require('CRC32') 166-- 167-- crchash = CRC32.Hash('a string') 168-- 169-- Methods: 170-- 171-- hashval = CRC32.Hash(val) 172-- Calculates and returns (as an integer) the CRC32 hash of the parameter 'val'. 173