PageRenderTime 15ms CodeModel.GetById 2ms app.highlight 9ms RepoModel.GetById 1ms app.codeStats 0ms

/CRC32.lua

http://luamemcached.googlecode.com/
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