Difference between revisions of "Module:Hash"
Jump to navigation
Jump to search
(Create simple CRC hashing module) |
(bugfix) |
||
(One intermediate revision by the same user not shown) | |||
Line 39: | Line 39: | ||
-- Returns a (stringified) CRC32 of the data | -- Returns a (stringified) CRC32 of the data | ||
− | function p. | + | function p.crc_internal(str) |
if not str then | if not str then | ||
return "nil" | return "nil" | ||
Line 59: | Line 59: | ||
end | end | ||
return string.format("%x", BitXOR(crc, 0xFFFFFFFF)) | return string.format("%x", BitXOR(crc, 0xFFFFFFFF)) | ||
+ | end | ||
+ | |||
+ | function p.crc(frame) | ||
+ | return p.crc_internal(frame.args[1]) | ||
end | end | ||
return p | return p |
Latest revision as of 00:03, 13 February 2022
Documentation for this module may be created at Module:Hash/doc
--[[
Simple module for hashing a string.
Generally you won't #invoke this directly, but use templates that do.
]]
-- Disallow global variable read/writes. Copied from Wikipedia's Module:No globals.
local mt = getmetatable(_G) or {}
function mt.__index (t, k)
if k ~= 'arg' then
error('Tried to read nil global ' .. tostring(k), 2)
end
return nil
end
function mt.__newindex(t, k, v)
if k ~= 'arg' then
error('Tried to write global ' .. tostring(k), 2)
end
rawset(t, k, v)
end
setmetatable(_G, mt)
local p = {}
local function BitXOR(a,b)
local p,c=1,0
while a>0 and b>0 do
local ra,rb=a%2,b%2
if ra~=rb then c=c+p end
a,b,p=(a-ra)/2,(b-rb)/2,p*2
end
if a<b then a=b end
while a>0 do
local ra=a%2
if ra>0 then c=c+p end
a,p=(a-ra)/2,p*2
end
return c
end
-- Returns a (stringified) CRC32 of the data
function p.crc_internal(str)
if not str then
return "nil"
end
local byte = string.byte
local floor = math.floor
local crc = 0xFFFFFFFF
for i = 1, #str do
local b = byte(str, i)
crc = BitXOR(crc, b)
for j = 1, 8 do
local mask = 0
if crc % 2 == 1 then
crc = BitXOR(floor(crc / 2), 0xEDB88320)
else
crc = floor(crc / 2)
end
end
end
return string.format("%x", BitXOR(crc, 0xFFFFFFFF))
end
function p.crc(frame)
return p.crc_internal(frame.args[1])
end
return p