-
-
Save jrus/3197011 to your computer and use it in GitHub Desktop.
local random = math.random | |
local function uuid() | |
local template ='xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx' | |
return string.gsub(template, '[xy]', function (c) | |
local v = (c == 'x') and random(0, 0xf) or random(8, 0xb) | |
return string.format('%x', v) | |
end) | |
end |
Hmm... any reason it always throws a 31 ending UUID? I've tried several "math.randomseed" possibilities I could think (included the suggested one a couple of comments above) and, even though everything else seems right, the always repeating 31 figure at the end kind of intrigues me... Does anyone else have encountered this behavior or has any idea of how could it be solved?
Ahhh... I think I got it... the 31 figure at the end of the resulting UUIDs, doesn't seem to be anything else than the number of matches returned by string.gsub that, for some reason, the program from I run Lua embedded is joining to the very end of the first returned parameter (the UUID itself) instead of showing it separated with a tab, space or whatever. So now I only have to find the way to get rid of such parameter or avoid it is captured/returned, ideally without complicating things too much...
And there it is! FTR, and as stated here, as soon as I wrapped all the string.gsub part into parenthesis, only the UUID is returned by the main function an everything seems to work as expected, cool! Thankfully, in Lua the simple addition of some parenthesis here or there is usually enough to save the day :)
And there it is! FTR, and as stated here, as soon as I wrapped all the string.gsub part into parenthesis, only the UUID is returned by the main function an everything seems to work as expected, cool! Thankfully, in Lua the simple addition of some parenthesis here or there is usually enough to save the day :)
You can try this:
return {string.format('%x', v)}[1]
You just wrap it into a table and then index the first object in that table.
Alternate solution without an auxiliary table: replace in the top function
return string.gsub(...)
with
local ans = string.gsub(...)
return ans
The first return value of string.gsub
is assigned to ans
, the others are ignored
@jrus Thank you for the snippet.
your can use this seed to avoid same uuid math.randomseed(tonumber(tostring(os.time()):reverse():sub(1, 9)))
I'd like to note, that this does not seem to work with lua 5.2.4. for i=1,10 do print(uuid()) end
will print 10 times the same UUID. However, without the custom seed, it works perfectly fine.
Or I guess one could simply use os.clock() instead os.time()? Or maybe a mixture of both to ensure different UUIDs no matter what, I think I'll try that and see... Thanks for the simple code, BTW!