blob: a70750bb3dab4f940fb1907343de45dfbab4a908 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
-- 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 random = require "prosody.util.random";
local random_bytes = random.bytes;
local time = require "prosody.util.time";
local hex = require "prosody.util.hex".encode;
local m_ceil = math.ceil;
local m_floor = math.floor;
local function get_nibbles(n)
return hex(random_bytes(m_ceil(n/2))):sub(1, n);
end
local function get_twobits()
return ("%x"):format(random_bytes(1):byte() % 4 + 8);
end
local 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
local function generate_v7()
-- Sortable based on time and random
-- https://datatracker.ietf.org/doc/html/draft-peabody-dispatch-new-uuid-format-01#section-4.4
local t = time.now();
local unixts = m_floor(t);
local unixts_a = m_floor(unixts / 16);
local unixts_b = m_floor(unixts % 16);
local subsec = t % 1;
local subsec_a = m_floor(subsec * 0x1000);
local subsec_b = m_floor(subsec * 0x1000000) % 0x1000;
return ("%08x-%x%03x-7%03x-%4s-%12s"):format(unixts_a, unixts_b, subsec_a, subsec_b, get_twobits() .. get_nibbles(3), get_nibbles(12));
end
return {
v4 = generate;
v7 = generate_v7;
get_nibbles=get_nibbles;
generate = generate ;
-- COMPAT
seed = random.seed;
};
|