-- Prosody IM
-- Copyright (C) 2008-2010 Matthew Wild
-- Copyright (C) 2008-2010 Waqas Hussain
--
-- This project is MIT/X11 licensed. Please see the
-- COPYING file in the source package for more information.
--
local m_random = math.random ;
local tostring = tostring ;
local os_time = os.time ;
local os_clock = os.clock ;
local sha1 = require " util.hashes " . sha1 ;
module " uuid "
local last_uniq_time = 0 ;
local function uniq_time ( )
local new_uniq_time = os_time ( ) ;
if last_uniq_time >= new_uniq_time then new_uniq_time = last_uniq_time + 1 ; end
last_uniq_time = new_uniq_time ;
return new_uniq_time ;
end
local function new_random ( x )
return sha1 ( x .. os_clock ( ) .. tostring ( { } ) , true ) ;
end
local buffer = new_random ( uniq_time ( ) ) ;
local function _seed ( x )
buffer = new_random ( buffer .. x ) ;
end
local function get_nibbles ( n )
if # buffer < n then _seed ( uniq_time ( ) ) ; end
local r = buffer : sub ( 0 , n ) ;
buffer = buffer : sub ( n + 1 ) ;
return r ;
end
local function get_twobits ( )
return ( " %x " ) : format ( get_nibbles ( 1 ) : byte ( ) % 4 + 8 ) ;
end
function generate ( )
-- generate RFC 4122 complaint UUIDs (version 4 - random)
return get_nibbles ( 8 ) .. " - " .. get_nibbles ( 4 ) .. " -4 " .. get_nibbles ( 3 ) .. " - " .. ( get_twobits ( ) ) .. get_nibbles ( 3 ) .. " - " .. get_nibbles ( 12 ) ;
end
seed = _seed ;
return _M ;