-- Генерирует UUID v5-подобную строку из входной строки (без внешних библиотек)
function stringToUUID(str)
-- Вспомогательная функция: 32-битный хеш без битовых операций
local function hash32(s, seed, mul)
local h = seed % 4294967296
for i = 1, #s do
h = (h * mul + string.byte(s, i)) % 4294967296
end
-- Добавляем длину строки для улучшения распределения
h = (h * mul + #s) % 4294967296
return h
end
-- Четыре разных набора параметров для получения 128 бит
local h1 = hash32(str, 0x811c9dc5, 16777619) -- FNV-1a подобный
local h2 = hash32(str, 0x12345678, 33)
local h3 = hash32(str, 0x9e3779b9, 65599)
local h4 = hash32(str, 0x85ebca6b, 31)
-- Собираем 32 hex символа (big-endian порядок)
local hex = string.format("%08x%08x%08x%08x", h1, h2, h3, h4)
-- Вставляем дефисы: 8-4-4-4-12
local uuid = string.sub(hex, 1, 8) .. "-" ..
string.sub(hex, 9, 12) .. "-" ..
string.sub(hex, 13, 16) .. "-" ..
string.sub(hex, 17, 20) .. "-" ..
string.sub(hex, 21, 32)
-- Устанавливаем версию (5) в третьем блоке (индекс 15 в строке с дефисами)
-- и вариант RFC 4122 (8) в четвёртом блоке (индекс 20)
local function setCharAt(s, pos, ch)
return s:sub(1, pos - 1) .. ch .. s:sub(pos + 1)
end
uuid = setCharAt(uuid, 15, '5') -- версия 5
uuid = setCharAt(uuid, 20, '8') -- вариант RFC 4122 (8,9,A,B)
return uuid
end
-- Пример использования:
print(stringToUUID("DP_SHLAK_GRNL_UST"))
print(stringToUUID("DP_SHLAK_GRNL_UST"))
print(stringToUUID("DP_SHLAK_GRNL_UST"))