Hash 如何在D中唯一标识用户定义的类型?

Hash 如何在D中唯一标识用户定义的类型?,hash,metaprogramming,d,Hash,Metaprogramming,D,我需要生成一些可以用作中用户定义类型(结构或类)的唯一句柄的内容。最好是编译时可计算的值。我希望句柄与类型的名称相关,如果类型的内部结构(数据布局)发生更改,并且在大多数其他编辑(包括将同一类型编译到不同的应用程序)中保持不变,则句柄也会发生更改 这不是一个安全的东西,所以它不需要很难绕过或任何事情 我目前的想法是使用一个字符串,它类似于类型名称、成员类型和名称的MD5散列 任何想法都将返回TypeInfo对象的唯一实例。理论上,您应该能够使用TypeInfo对象的地址作为类型的唯一标识符值。您

我需要生成一些可以用作中用户定义类型(结构或类)的唯一句柄的内容。最好是编译时可计算的值。我希望句柄与类型的名称相关,如果类型的内部结构(数据布局)发生更改,并且在大多数其他编辑(包括将同一类型编译到不同的应用程序)中保持不变,则句柄也会发生更改

这不是一个安全的东西,所以它不需要很难绕过或任何事情

我目前的想法是使用一个字符串,它类似于类型名称、成员类型和名称的MD5散列


任何想法都将返回TypeInfo对象的唯一实例。理论上,您应该能够使用TypeInfo对象的地址作为类型的唯一标识符值。

您知道,您可以将一个修订硬编码到类型中,如“const REV=173;”,然后在每次更改布局时更新它,然后将其与类型名称混合以生成标识符


这有点麻烦,因为它需要手动更新,但您可以编写脚本,在svn diff识别该类中的更改时,在提交时自动更新它。这可能是最简单的解决方案。

经过一段时间的思考,我认为这是一种可行的方法(注意:这只是伪代码):

也就是说,根据类型的名称(您可能需要切掉模块和包,不确定),以及每个成员的类型ID、偏移量和名称来构造唯一ID


根据您的具体需要,您可以删除成员名称。

类型的完全限定名称应该是唯一的。这与typeid(T.toString)相同。这与T.stringof不同——T.stringof将删除任何模板实例化,并且不会给出完全限定名


解决方法是在编译时使用demangled(T.mangleof)和在运行时使用typeid(T).toString。

这有两个问题,它不适用于DLL,并且不是编译时值。这需要能够编辑类型。在我的情况下,我不能指望这一点。我也会要求/my/users这样做。这或多或少是我的第一个想法,它会起作用。(+1)OTOH我仍然希望有一些出色的解决方案。有用!只要想一想,我想我也许能用上。它不会注意到成员的变化,但也可以这样做。
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)