如何在 Lua 中将字符串(十六进制字符串)转换为 uint64?

我需要将 sip callId(例如 1097074724_100640573@8.8,8.8)字符串转换为 requestId,并且我正在使用 sha1 摘要获取哈希值。由于内部兼容性,我需要将这个十六进制转换成 uint64_t:

--
-- 从 callId 获取 request-id
--
-- 返回哈希
--
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","")-去掉换行符
   handle:close()

   --如何将输出哈希转换为 uint64?
end

我不确定 Lua 中是否支持 uint64。此外,如何进行转换?

点赞
用户6834680
用户6834680

你可以从 Lua 以两个 "double" 值的形式接收两个 32 位整数,并在 C 方面将它们转换为一个 "uint64"。

outputHash = '317acf63c685455cfaaf1c3255eeefd6ca3c5571'

local p = 4241942993 -- 小于 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  -- 两个数字都在 0..(2^32-1) 范围内
2018-03-22 08:38:26