[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: bloom filter?
- From: Wim Couwenberg <w.couwenberg@...>
- Date: Thu, 24 Feb 2005 22:22:25 +0100
Does anyone know of a Bloom filter [1] implementation in Lua? Or perhaps 
in C with some Lua bindings?
No, but here's something to build it with: a 100% Lua implementation of 
a bitset.
--
Wim
--
-- A "packbits" implementation of a bitset.
-- A bitset is any set of non-negative integers.
-- Does not support iteration over the set (yet).
--
-- author:  Wim Couwenberg
-- created: thu, Feb 24, 2005
--
-- Sample usage:
--
--		local set = bitset()
--		set[10] = true
--		set[15] = true
--		set[8] = false
--		if set[10] then print "10 is in the set" end
--
local split, test
do
	-- determine precision of Lua's number type and
	-- setup a table of bitmasks.  (only tested on a
	-- system where a number is an IEEE 754 double
	-- though.)
	local masks = {}
	local function prepmasks(i, p)
		if p < 0 or p + 1 == p then
			return i
		else
			masks[i] = p
			return prepmasks(i + 1, 2*p)
		end
	end
	local stride = prepmasks(0, 1)
	local maxmask = masks[stride - 1]
	function split(n)
		local r = math.mod(n, stride)
		return n - r, masks[r]
	end
	function test(n, m)
		if m == maxmask then
			return n >= m
		else
			return math.mod(n, 2*m) >= m
		end
	end
end
local bitset_meta = {}
function bitset_meta:__index(n)
	local index, mask = split(n)
	local s = self.set[index]
	return s ~= nil and test(s, mask)
end
function bitset_meta:__newindex(n, v)
	local index, mask = split(n)
	local s = self.set[index]
	if v then
		if not s then
			self.set[index] = mask
		elseif not test(s, mask) then
			self.set[index] = s + mask
		end
	elseif s == mask then
		self.set[index] = nil
	elseif s and test(s, mask) then
		self.set[index] = s - mask
	end
end
function bitset()
	return setmetatable({ set = {} }, bitset_meta)
end