Esempio n. 1
0
    int MMKVImpl::SRandMember(DBID db, const Data& key, const StringArrayResult& members, int count)
    {
        int err = 0;
        RWLockGuard<MemorySegmentManager, READ_LOCK> keylock_guard(m_segment);
        StringSet* set = GetObject<StringSet>(db, key, V_TYPE_SET, false, err)();
        if (IS_NOT_EXISTS(err))
        {
            return 0;
        }
        if (0 != err)
        {
            return err;
        }
        if (set->empty())
        {
            return 0;
        }

        //return whole set
        if (count > 0 && count > set->size())
        {
            StringSet::iterator it = set->begin();
            while (it != set->end())
            {
                it->ToString(members.Get());
                it++;
            }
            return 0;
        }

        int rand = 0;
        for (int i = 0; i < std::abs(count); i++)
        {
            if (count > 0)
            {
                if (i == 0)
                {
                    rand = random_between_int32(0, set->size() - 1);
                }
                else
                {
                    rand += i;
                    if (rand >= set->size())
                    {
                        rand -= set->size();
                    }
                }
            }
            else
            {
                rand = random_between_int32(0, set->size() - 1);
            }
            StringSet::iterator it = set->begin();
            it.increment_by(rand);
            it->ToString(members.Get());
        }
        return 0;
    }
Esempio n. 2
0
 std::string random_between_string(const std::string& min, const std::string& max)
 {
     if (min == max)
     {
         return min;
     }
     std::string random_key;
     for (uint32 i = 0; i < min.size() && i < max.size(); i++)
     {
         if (min[i] < max[i])
         {
             if (min[i] == max[i] - 1)
             {
                 random_key.push_back(min[i]);
                 for (uint32 j = i + 1; j < min.size(); j++)
                 {
                     if (min[j] == 127)
                     {
                         random_key.push_back(min[j]);
                     }
                     else
                     {
                         char c = (char) random_between_int32(min[j], 127);
                         random_key.push_back(c);
                         if (c > min[j])
                         {
                             break;
                         }
                     }
                 }
             }
             else
             {
                 char c = (char) random_between_int32(min[i], max[i]);
                 while (c == min[i] || c == max[i])
                 {
                     c = (char) random_between_int32(min[i], max[i]);
                 }
                 random_key.push_back(c);
             }
             break;
         }
         else
         {
             random_key.push_back(min[i]);
         }
     }
     random_key.append(random_string(5));
     return random_key;
 }