在c ++地图中搜索授权

时间:2015-03-27 16:02:45

标签: c++ dictionary search authorization usergroups

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

为每个用户组生成另一张地图是否能更快地访问?

1 个答案:

答案 0 :(得分:0)

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

  1. 物体
  2. 用户
  3. 为了简化事情,我们只关注后者2.

    1. 您是否正在优化某个案例,在某个群组中,您想要检查某个特定用户是否属于它?

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

    3. 您是在优化尺寸还是速度?

    4. 根据答案(对于这些以及可能的许多其他问题),不同的解决方案可能适合您。

      例如,请考虑以下事项:

      #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同时映射组和用户的权限。因此,它允许组和用户有效访问;相反,它是一个更复杂的对象,具有更高的空间和时间开销。