这是MFC的CMap类中的默认HashKey函数.
AFX_INLINE UINT AFXAPI HashKey(ARG_KEY key)
{
??// default identity hash - works for most primitive values
??return ((UINT)(void*)(DWORD)key) >> 4;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么需要类型转换(DWORD)和(void*)?我猜(DWORD)可能与16位机器的兼容性事务有一些关系.但我对虚空*感到困惑.
template<class ARG_KEY>
AFX_INLINE UINT AFXAPI HashKey(ARG_KEY key)
{
// default identity hash - works for most primitive values
return (DWORD)(((DWORD_PTR)key)>>4);
}
Run Code Online (Sandbox Code Playgroud)
这就是今天的功能.您的版本来自一个非常旧版本的MFC,足以支持16位程序.MFC于1992年首次发布,即Windows版本3的时代.MFC版本1.0到2.5支持16位目标.该函数的当前版本适用于32位和64位代码.
在16位代码中,一个选择的选项是内存模型.你可以选择便宜的16位近指针或昂贵的32位远指针.因此额外的void*cast会将值修剪为内存模型大小.