Как преобразовать строку (шестнадцатеричная десятичная строка) в uint64 в Lua?

Мне нужно преобразовать строку sip callId (например, [email protected],8.8) в requestId, и я использую дайджест sha1 для получения хэша. Мне нужно преобразовать это шестнадцатеричное число в uint64_t из-за внутренней совместимости:

--
-- Obtain request-id from callId
-- 
--  Returns hash
--
function common_get_request_id( callId )
   local command = "echo -n \"" .. callId .. "\" | openssl sha1 | sed 's/(stdin)= //g'"
   local handle = assert( io.popen( command, "r" ) )
   local output = handle:read( "*all" )
   local outputHash = string.gsub(output, "\n", "") -- strip newline
   handle:close()

   -- How to convert outputHash to uint64?  
end

Я не уверен в поддержке uint64 в Lua. Кроме того, как сделать преобразование?


person ssk    schedule 21.03.2018    source источник
comment
SHA1 выдает 160 бит, а не 64. Какое преобразование вы хотите?   -  person lhf    schedule 22.03.2018


Ответы (1)


Вы можете получить два 32-битных целых числа из Lua как два «двойных» значения и преобразовать их в одно «uint64» на стороне C.

outputHash = '317acf63c685455cfaaf1c3255eeefd6ca3c5571'

local p = 4241942993 -- some prime below 2^32
local c1, c2 = 0, 0

for a, b in outputHash:gmatch"(%x)(%x)" do
   c1 = (c1 * 16 + tonumber(a, 16)) % p
   c2 = (c2 * 16 + tonumber(b, 16)) % p
end

return c1, c2  -- both numbers 0..(2^32-1)
person Egor Skriptunoff    schedule 22.03.2018