我需要生成一些可以用作D programming language中用户定义类型(结构或类)的唯一句柄的东西。优选地,这将是编译时可计算值。我希望句柄与类型的名称相关,并且如果类型的内部结构(数据布局)发生更改,则更改,但对于大多数其他编辑保持相同(包括将相同类型编译到不同的应用程序中)。
这不是一个安全问题,因此不需要很难绕过任何东西
我目前的想法是使用类似名称和成员类型和名称的MD5哈希字符串。
任何想法
答案 0 :(得分:1)
在考虑了这一点之后,我认为这将是一种可行的方法(注意:这只是伪代码):
UniqueId(Type) = Type.stringof ~ MemberIds!(Type.tupleof)
UniqueId(Type) if( Type is builtin ) = Type.stringof
MemberIds(M, Ms...) = "," ~ UniqueId!(typeof(M))
~ "@" ~ ToString!(M.offsetof)
~ ":" ~ M.stringof
~ MemberIds!(Ms)
也就是说,从类型名称构造唯一ID(您可能需要切断模块和包,不确定),以及每个成员的类型ID,偏移量和名称。
根据您的需要,您可以删除会员名称。
答案 1 :(得分:1)
类型的完全限定名称应该是唯一的。这与typeid(T).toString相同。这是不与T.stringof相同 - T.stringof将删除任何模板实例,并且不会提供完全限定名称。
解决方法是在编译时使用demangled(T.mangleof),在运行时使用typeid(T).toString。
答案 2 :(得分:0)
typeid expression将返回TypeInfo对象的唯一实例。理论上,您应该能够使用TypeInfo对象的地址作为类型的唯一标识符值。
答案 3 :(得分:0)
您知道,您可以将修订版硬编码到类型中,例如“const REV = 173;”,然后在每次更改布局时更新它,然后将其与类型名称混合以生成您的标识符。
这有点麻烦,因为它需要手动更新,但是当svn diff识别出该类中的更改时,您可以编写脚本以在提交时自动更新。这可能是最简单的解决方案。