Hash Lua轻型用户数据

Hash Lua轻型用户数据,hash,lua,lua-userdata,Hash,Lua,Lua Userdata,我和Lua之间有问题,我不知道我的方向是否正确。在C++中,我有一个字典,用来传递参数到资源管理器。这本字典实际上类似于散列和字符串的映射 在Lua中,我希望访问这些资源,因此我需要哈希的表示。此外,哈希必须是唯一的,因为它们在表中用作索引。我们的哈希函数是64位的,我正在32位环境(PS3)上工作 C++我有这样一些东西: paramMap.insert(std::make_pair(hash64(“vehicleId”),std::string(“004”); createResource(

我和Lua之间有问题,我不知道我的方向是否正确。在C++中,我有一个字典,用来传递参数到资源管理器。这本字典实际上类似于散列和字符串的映射

在Lua中,我希望访问这些资源,因此我需要哈希的表示。此外,哈希必须是唯一的,因为它们在表中用作索引。我们的哈希函数是64位的,我正在32位环境(PS3)上工作

C++我有这样一些东西:

paramMap.insert(std::make_pair(hash64(“vehicleId”),std::string(“004”);
createResource(ResourceType(“Car”),paramMap);
在Lua中,您希望使用这些资源为其他用户数据创建工厂。 我做的事情有:

函数findBike(carId)
bikeParam={vehicleId=carId}
return ResourceManager.findResource('car',bikeParam)
结束

>,LUA创建了某个时间参数,C++使用了某个时间参数。 因为my

hashkey('vehicleId')
是表的索引,它需要是唯一的。 我已经使用lightuserdata实现了uint64_t,但由于我处于32位环境中,我不能简单地将
int64
存储在指针中:(

我必须创建一个表来存储程序使用的所有
int64
,并在userdata中保存一个引用

void pushUInt64(lua_State*L,GEM::GUInt64 v)
{
Int64Ref::Handle Handle=Int64Ref::getInstance().allocateSlot(v);
lua_pushlightuserdata(L,重新解释cast(句柄));
luaL_可设置元表(L,s_UINT64 LUANAME);
}
但是用户数据永远不会被垃圾收集,然后我的int64永远不会被释放,我的表将永远增长。 另外,lightuserdata不保留对元数据的引用,因此它们会干扰其他lightuserdata。检查实现时,元数据表将添加到L->G->mt\中[2]。 那样做

a = createLightUserDataType1()
b = createLightUserDataType2()
a:someFunction()
将使用
b
的元表

我认为那个元表是绑定到类型的。 我很困惑,对于当前的实现,lightuserdata的用例非常有限

有了Python,您就有了一个元函数,只要该类型被用作字典的索引,它就会被调用


对不起,我的英语不好,我来自意大利。:-/

使用完整的用户数据怎么样?这些数据由lua管理和垃圾收集。每个完整的用户数据都可以有自己的元表。@greatwolf:我几乎对任何事情都使用完整的用户数据,但在这种特殊情况下,我必须索引一个表。如果hash64(str)生成完整的用户数据,那么a=hash64(“vType”);b=hash64(“vType”);c={};c[a]=“car”;print(c[b]);将打印nil,导致a端b具有不同的指针。如果缓存计算出的哈希值并将其映射到弱表,该怎么办?这样可以确保在执行
a=hash64(“vType”);b=hash64(“vType”)时;
a
b
将引用相同的用户数据。如果您将哈希存储为lua字符串,该怎么办?现在,因为我们需要关闭项目,我们正是这样做的。它是有效的,但当我有更多时间时,我将使用greatwolf建议的解决方案。一个弱表,在给出一个新的hash64对象之前,我检查对象已存在于表中。