diff --git a/src/dict.c b/src/dict.c index 99a697365ace8b85963392d898ba9bd0ab26a155..01741b50134821ea05706832cb20cbf2f0fbfa40 100644 --- a/src/dict.c +++ b/src/dict.c @@ -661,81 +661,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 < (unsigned int) 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. * diff --git a/src/dict.h b/src/dict.h index 5959a57b9d5d1ce73dedf2d3cecc252544401887..014d182123f81f4df05f8aab861d09aa8f7fc798 100644 --- a/src/dict.h +++ b/src/dict.h @@ -165,7 +165,6 @@ dictEntry *dictNext(dictIterator *iter); void dictReleaseIterator(dictIterator *iter); dictEntry *dictGetRandomKey(dict *d); unsigned int dictGetSomeKeys(dict *d, dictEntry **des, unsigned int count); -unsigned int dictGetRandomKeys(dict *d, dictEntry **des, unsigned int count); void dictPrintStats(dict *d); unsigned int dictGenHashFunction(const void *key, int len); unsigned int dictGenCaseHashFunction(const unsigned char *buf, int len);