gpt4 book ai didi

c++ - 高效可靠的 SID/PSID 散列

转载 作者:太空宇宙 更新时间:2023-11-04 13:21:46 28 4
gpt4 key购买 nike

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

这可以通过 LookupAccountSid 来完成.不幸的是,这个 API 需要在很多地方四处嗅探以解析 SID,包括可能的网络调用。因此我想缓存以前看到的 SID。

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

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

最佳答案

可以存储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 header 。

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

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

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

The data is '\0'-terminated unless the QByteArray object was created from raw data.

不幸的是,这段代码依赖于 Qt 框架,但它也应该适用于其他容器,例如 std::vector

关于c++ - 高效可靠的 SID/PSID 散列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35001367/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com