SID / PSID的高效可靠哈希

时间:2016-01-25 20:07:50

标签: c++ winapi hash

我的应用程序需要将大量PSID转换为友好域\用户名字符串。

可以使用LookupAccountSid完成此操作。不幸的是,这个API需要在许多地方嗅探以解决SID,包括可能的网络调用。因此,我想缓存以前见过的SID。

我目前正在使用哈希表(CMap)执行此操作,该表由SID的字符串表示键入,即ConvertSidToStringSid的结果。这工作正常,但我想知道是否有一个众所周知,高效,可靠的SID哈希例程,所以我不必转换为字符串?

可能将SID复制到字节缓冲区并散列缓冲区?或者通过其他API遍历SID本身的结构?

1 个答案:

答案 0 :(得分:0)

可以存储SID结构的字节。 SID结构的长度是可变的,因此您必须首先使用GetLengthSid函数检索它。

以下是我使用的Qt中的一个实现,用于将值存储在QByteArray

PSID sid = ...

// retreive the length in bytes of the sid structure
DWORD sidSize = GetLengthSid(sid);

// check that sidSize fits into QByteArray::fromRawData
Q_ASSERT(sidSize <= INT_MAX);

QByteArray baSid = QByteArray::fromRawData((char *) sid, sidSize);

QByteArray::fromRawData仅包装数据而不进行复制。如果需要副本,请使用构造函数QByteArray::QByteArray(const char *data, int size = -1)

然后,您可以将字节数组存储在任何Qt容器中,例如QSet

请注意GetLengthSid返回DWORD(在我的系统中定义为unsigned long),fromRawData接受int。我从未对该对话产生任何问题,但我在测试中包含了值不是太大的问题,INT_MAX宏来自climits标题。

如果构造PSID,则可以使用constData轻松将字节数组转换回fromRawData

PSID sid = (PSID) baSid.constData();

我没有在未构造constData时测试fromRawData,但文档指出:

  

除非创建了QByteArray对象,否则数据将被'\ 0'终止   来自原始数据。

不幸的是,此代码依赖于Qt框架,但它也应该与其他容器一起使用,例如std::vector