Software /
code /
prosody
Annotate
util/uuid.lua @ 13552:f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Problem: The string slice operations when a lot of data gets buffered
ends up being expensive and memory-consuming. We have util.dbuffer for
precisely this kind of thing.
I want to keep the behavior of writebuffer being upgraded from nil to a
string to full buffer since the last step involves three table
allocations, where the previous buffer method only used one. Avoiding
those allocations for simple writes like white space keep alive feels
like it would keep memory churn down.
This work was started in 2020
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Sat, 09 Nov 2024 00:37:15 +0100 |
parent | 13317:e6a5f196fc1f |
rev | line source |
---|---|
1523
841d61be198f
Remove version number from copyright headers
Matthew Wild <mwild1@gmail.com>
parents:
1304
diff
changeset
|
1 -- Prosody IM |
2923
b7049746bd29
Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents:
1523
diff
changeset
|
2 -- Copyright (C) 2008-2010 Matthew Wild |
b7049746bd29
Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents:
1523
diff
changeset
|
3 -- Copyright (C) 2008-2010 Waqas Hussain |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
2957
diff
changeset
|
4 -- |
758 | 5 -- This project is MIT/X11 licensed. Please see the |
6 -- COPYING file in the source package for more information. | |
519
cccd610a0ef9
Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents:
145
diff
changeset
|
7 -- |
cccd610a0ef9
Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents:
145
diff
changeset
|
8 |
12975
d10957394a3c
util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12355
diff
changeset
|
9 local random = require "prosody.util.random"; |
6377
50e5aed4eeea
util.uuid: Use util.hex and util.random
Matthew Wild <mwild1@gmail.com>
parents:
5776
diff
changeset
|
10 local random_bytes = random.bytes; |
13317 | 11 local time = require "prosody.util.time"; |
12975
d10957394a3c
util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12355
diff
changeset
|
12 local hex = require "prosody.util.hex".encode; |
6377
50e5aed4eeea
util.uuid: Use util.hex and util.random
Matthew Wild <mwild1@gmail.com>
parents:
5776
diff
changeset
|
13 local m_ceil = math.ceil; |
13317 | 14 local m_floor = math.floor; |
44
80d2ade0fd69
Add "uuid" library and make sessionmanager use this.
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
15 |
1303
2170e2c0d57a
util.uuid: Now generates RFC 4122 complaint UUIDs (version 4 - random)
Waqas Hussain <waqas20@gmail.com>
parents:
1302
diff
changeset
|
16 local function get_nibbles(n) |
6377
50e5aed4eeea
util.uuid: Use util.hex and util.random
Matthew Wild <mwild1@gmail.com>
parents:
5776
diff
changeset
|
17 return hex(random_bytes(m_ceil(n/2))):sub(1, n); |
1303
2170e2c0d57a
util.uuid: Now generates RFC 4122 complaint UUIDs (version 4 - random)
Waqas Hussain <waqas20@gmail.com>
parents:
1302
diff
changeset
|
18 end |
2170e2c0d57a
util.uuid: Now generates RFC 4122 complaint UUIDs (version 4 - random)
Waqas Hussain <waqas20@gmail.com>
parents:
1302
diff
changeset
|
19 |
2170e2c0d57a
util.uuid: Now generates RFC 4122 complaint UUIDs (version 4 - random)
Waqas Hussain <waqas20@gmail.com>
parents:
1302
diff
changeset
|
20 local function get_twobits() |
7049
0eee56075901
util.uuid: Take random byte directly instead of the low bits from the ascii value of a hex nibble
Kim Alvefur <zash@zash.se>
parents:
7012
diff
changeset
|
21 return ("%x"):format(random_bytes(1):byte() % 4 + 8); |
1303
2170e2c0d57a
util.uuid: Now generates RFC 4122 complaint UUIDs (version 4 - random)
Waqas Hussain <waqas20@gmail.com>
parents:
1302
diff
changeset
|
22 end |
2170e2c0d57a
util.uuid: Now generates RFC 4122 complaint UUIDs (version 4 - random)
Waqas Hussain <waqas20@gmail.com>
parents:
1302
diff
changeset
|
23 |
6377
50e5aed4eeea
util.uuid: Use util.hex and util.random
Matthew Wild <mwild1@gmail.com>
parents:
5776
diff
changeset
|
24 local function generate() |
1303
2170e2c0d57a
util.uuid: Now generates RFC 4122 complaint UUIDs (version 4 - random)
Waqas Hussain <waqas20@gmail.com>
parents:
1302
diff
changeset
|
25 -- generate RFC 4122 complaint UUIDs (version 4 - random) |
2170e2c0d57a
util.uuid: Now generates RFC 4122 complaint UUIDs (version 4 - random)
Waqas Hussain <waqas20@gmail.com>
parents:
1302
diff
changeset
|
26 return get_nibbles(8).."-"..get_nibbles(4).."-4"..get_nibbles(3).."-"..(get_twobits())..get_nibbles(3).."-"..get_nibbles(12); |
1302
4561c6d95339
util.uuid: More uniqueness!
Waqas Hussain <waqas20@gmail.com>
parents:
896
diff
changeset
|
27 end |
7057 | 28 |
13317 | 29 local function generate_v7() |
30 -- Sortable based on time and random | |
31 -- https://datatracker.ietf.org/doc/html/draft-peabody-dispatch-new-uuid-format-01#section-4.4 | |
32 local t = time.now(); | |
33 local unixts = m_floor(t); | |
34 local unixts_a = m_floor(unixts / 16); | |
35 local unixts_b = m_floor(unixts % 16); | |
36 local subsec = t % 1; | |
37 local subsec_a = m_floor(subsec * 0x1000); | |
38 local subsec_b = m_floor(subsec * 0x1000000) % 0x1000; | |
39 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)); | |
40 end | |
41 | |
6377
50e5aed4eeea
util.uuid: Use util.hex and util.random
Matthew Wild <mwild1@gmail.com>
parents:
5776
diff
changeset
|
42 return { |
13317 | 43 v4 = generate; |
44 v7 = generate_v7; | |
6377
50e5aed4eeea
util.uuid: Use util.hex and util.random
Matthew Wild <mwild1@gmail.com>
parents:
5776
diff
changeset
|
45 get_nibbles=get_nibbles; |
50e5aed4eeea
util.uuid: Use util.hex and util.random
Matthew Wild <mwild1@gmail.com>
parents:
5776
diff
changeset
|
46 generate = generate ; |
50e5aed4eeea
util.uuid: Use util.hex and util.random
Matthew Wild <mwild1@gmail.com>
parents:
5776
diff
changeset
|
47 -- COMPAT |
50e5aed4eeea
util.uuid: Use util.hex and util.random
Matthew Wild <mwild1@gmail.com>
parents:
5776
diff
changeset
|
48 seed = random.seed; |
50e5aed4eeea
util.uuid: Use util.hex and util.random
Matthew Wild <mwild1@gmail.com>
parents:
5776
diff
changeset
|
49 }; |