summaryrefslogtreecommitdiff
path: root/src/dict.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/dict.c')
-rw-r--r--src/dict.c75
1 files changed, 0 insertions, 75 deletions
diff --git a/src/dict.c b/src/dict.c
index 716d03fb0..dbcfeb492 100644
--- a/src/dict.c
+++ b/src/dict.c
@@ -664,81 +664,6 @@ dictEntry *dictGetRandomKey(dict *d)
return he;
}
-/* XXX: This is going to be removed soon and SPOP internals
- * reimplemented.
- *
- * This is a version of dictGetRandomKey() that is modified in order to
- * return multiple entries by jumping at a random place of the hash table
- * and scanning linearly for entries.
- *
- * Returned pointers to hash table entries are stored into 'des' that
- * points to an array of dictEntry pointers. The array must have room for
- * at least 'count' elements, that is the argument we pass to the function
- * to tell how many random elements we need.
- *
- * The function returns the number of items stored into 'des', that may
- * be less than 'count' if the hash table has less than 'count' elements
- * inside.
- *
- * Note that this function is not suitable when you need a good distribution
- * of the returned items, but only when you need to "sample" a given number
- * of continuous elements to run some kind of algorithm or to produce
- * statistics. However the function is much faster than dictGetRandomKey()
- * at producing N elements, and the elements are guaranteed to be non
- * repeating. */
-unsigned int dictGetRandomKeys(dict *d, dictEntry **des, unsigned int count) {
- unsigned int j; /* internal hash table id, 0 or 1. */
- unsigned int tables; /* 1 or 2 tables? */
- unsigned int stored = 0, maxsizemask;
-
- if (dictSize(d) < count) count = dictSize(d);
-
- /* Try to do a rehashing work proportional to 'count'. */
- for (j = 0; j < count; j++) {
- if (dictIsRehashing(d))
- _dictRehashStep(d);
- else
- break;
- }
-
- tables = dictIsRehashing(d) ? 2 : 1;
- maxsizemask = d->ht[0].sizemask;
- if (tables > 1 && maxsizemask < d->ht[1].sizemask)
- maxsizemask = d->ht[1].sizemask;
-
- /* Pick a random point inside the larger table. */
- unsigned int i = random() & maxsizemask;
- while(stored < count) {
- for (j = 0; j < tables; j++) {
- /* Invariant of the dict.c rehashing: up to the indexes already
- * visited in ht[0] during the rehashing, there are no populated
- * buckets, so we can skip ht[0] for indexes between 0 and idx-1. */
- if (tables == 2 && j == 0 && i < d->rehashidx) {
- /* Moreover, if we are currently out of range in the second
- * table, there will be no elements in both tables up to
- * the current rehashing index, so we jump if possible.
- * (this happens when going from big to small table). */
- if (i >= d->ht[1].size) i = d->rehashidx;
- continue;
- }
- if (i >= d->ht[j].size) continue; /* Out of range for this table. */
- dictEntry *he = d->ht[j].table[i];
- while (he) {
- /* Collect all the elements of the buckets found non
- * empty while iterating. */
- *des = he;
- des++;
- he = he->next;
- stored++;
- if (stored == count) return stored;
- }
- }
- i = (i+1) & maxsizemask;
- }
- return stored; /* Never reached. */
-}
-
-
/* This function samples the dictionary to return a few keys from random
* locations.
*