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 <[email protected]>
  • Loading branch information
bungle committed Jun 7, 2024
1 parent d1994f7 commit 7b1a440
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 8 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
2 changes: 0 additions & 2 deletions t/01-pdk/02-log/05-set_serialize_value.t
Original file line number Diff line number Diff line change
Expand Up @@ -325,5 +325,3 @@ Proxy-Authorization REDACTED
PROXY_AUTHORIZATION REDACTED
--- no_error_log
[error]

0 comments on commit 7b1a440

Please sign in to comment.