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; }
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; }