Skip to content

Commit

Permalink
refactor(tools/rand): speed up random string generation, take 2
Browse files Browse the repository at this point in the history
### Summary

This PR optimizes the `kong.tools.rand.random_string`.

Results can be seen in PR that this PR replaces:
#13150 (comment)

KAG-4673

Signed-off-by: Aapo Talvensaari <aapo.talvensaari@gmail.com>
  • Loading branch information
bungle committed Jun 7, 2024
1 parent d1994f7 commit 6a51707
Showing 1 changed file with 23 additions and 6 deletions.
29 changes: 23 additions & 6 deletions kong/tools/rand.lua
Original file line number Diff line number Diff line change
Expand Up @@ -106,26 +106,43 @@ _M.get_rand_bytes = get_rand_bytes
-- @return string The random string (a chunk of base64ish-encoded random bytes)
local random_string
do
local char = string.char
local rand = math.random
local byte = string.byte
local encode_base64 = ngx.encode_base64

local OUTPUT = require("string.buffer").new(32)
local SLASH_BYTE = byte("/")
local PLUS_BYTE = byte("+")

-- generate a random-looking string by retrieving a chunk of bytes and
-- replacing non-alphanumeric characters with random alphanumeric replacements
-- (we dont care about deriving these bytes securely)
-- this serves to attempt to maintain some backward compatibility with the
-- previous implementation (stripping a UUID of its hyphens), while significantly
-- expanding the size of the keyspace.
random_string = function()
OUTPUT:reset()

-- get 24 bytes, which will return a 32 char string after encoding
-- this is done in attempt to maintain backwards compatibility as
-- much as possible while improving the strength of this function
return encode_base64(get_rand_bytes(24, true))
:gsub("/", char(rand(48, 57))) -- 0 - 10
:gsub("+", char(rand(65, 90))) -- A - Z
:gsub("=", char(rand(97, 122))) -- a - z
end
local str = encode_base64(get_rand_bytes(24, true), true)

for i = 1, 32 do
local b = byte(str, i)
if b == SLASH_BYTE then
OUTPUT:putf("%c", rand(48, 57))
elseif b == PLUS_BYTE then
OUTPUT:putf("%c", rand(65, 90))
else
OUTPUT:putf("%c", b)
end
end

str = OUTPUT:get()

return str
end
end
_M.random_string = random_string

Expand Down

0 comments on commit 6a51707

Please sign in to comment.