【问题标题】:searching a c++ map for authorization搜索 C++ 地图以获取授权
【发布时间】:2015-06-01 00:55:53
【问题描述】:

我想知道在地图上搜索用户组的有效方法是什么。假设我们有一个用户组有权访问的特定对象的地图。

为每个用户组生成另一个地图以便能够更快地访问会更好吗?

【问题讨论】:

    标签: c++ dictionary search authorization usergroups


    【解决方案1】:

    这实际上取决于您预期的使用模式。您拥有三种类型的实体:

    1. 对象
    2. 群组
    3. 用户

    为了简化事情,让我们只关注后2个。

    1. 您是否正在优化给定组的情况,您希望检查特定用户是否属于该组?

    2. 从所有组中删除用户是否重要?它应该影响多线程环境中的其他用户吗?如果是,它必须是原子的吗?

    3. 您是在优化大小还是速度?

    根据答案(对这些问题以及可能还有许多其他问题),不同的解决方案可能对您有用。

    例如,考虑以下情况:

    #include <unordered_map>
    #include <unordered_set>
    
    using user_id_t = std::size_t;
    using group_id_t = std::size_t;
    
    using group_to_users_t = std::unordered_map<group_id_t, std::unordered_set<user_id_t>>;
    
    int main() {
        group_to_users_t authorized;
    
        authorized[3].insert(20);
    }
    

    这使用std::unordered_map 将每个组与std::unordered_set 的用户匹配。它展示了如何将用户 20 插入到组 3。查询用户 20 是否属于组 3 非常有效。回答用户 20 属于哪些组时效率非常低。

    反过来,考虑以下几点:

    #include <boost/multi_index_container.hpp>
    #include <boost/multi_index/hashed_index.hpp>
    #include <boost/multi_index/ordered_index.hpp>
    #include <boost/multi_index/identity.hpp>
    #include <boost/multi_index/member.hpp>
    
    using namespace boost;
    using namespace boost::multi_index;
    
    struct permission {
        std::size_t m_group_id;
        std::size_t m_user_id;
    };
    
    using  permissions_t = multi_index_container<
        permission,
        indexed_by<
            ordered_non_unique<member<permission, decltype(permission{}.m_user_id), &permission::m_user_id>>,
            ordered_non_unique<member<permission,std::size_t,&permission::m_group_id>>>>;
    
    int main() {
        permissions_t permissions;
    
        permission foo{3, 20};
        permissions.insert(foo);
    }
    

    它使用boost::multi_index::multi_index_container 同时映射组和用户的权限。因此,它允许组和用户有效地访问;相反,它是一个更复杂的对象,具有更高的空间和时间开销。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-16
      • 2015-04-22
      • 2019-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多