Differences From Artifact [c18a26ad1f]:
- File src/OFMapTable.m — part of check-in [ed438b979d] at 2012-12-01 17:50:44 on branch trunk — OFSet_hashtable: Store in OFMapTable. (user: js, size: 15781) [annotate] [blame] [check-ins using]
To Artifact [fac29d9273]:
- File
src/OFMapTable.m
— part of check-in
[590fa6ed79]
at
2012-12-04 09:59:09
on branch trunk
— Add a per-hashtable seed.
This should make it impossible to retrieve of_hash_seed by inserting
keys into a hashtable and then retrieving the hashtable. Without this
change, the order could be used to make guesses about of_hash_seed,
which could be a problem for long running processes. (user: js, size: 16029) [annotate] [blame] [check-ins using]
︙ | ︙ | |||
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | * Public License, either version 2 or 3, which can be found in the file * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #include "config.h" #include <string.h> #import "OFMapTable.h" #import "OFEnumerator.h" #import "OFEnumerationMutationException.h" #import "OFInvalidArgumentException.h" #import "OFNotImplementedException.h" | > > > | 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | * Public License, either version 2 or 3, which can be found in the file * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #include "config.h" #include <stdlib.h> #include <string.h> #include <sys/time.h> #import "OFMapTable.h" #import "OFEnumerator.h" #import "OFEnumerationMutationException.h" #import "OFInvalidArgumentException.h" #import "OFNotImplementedException.h" |
︙ | ︙ | |||
143 144 145 146 147 148 149 150 151 152 153 154 155 156 | minCapacity = capacity; buckets = [self allocMemoryWithSize: sizeof(*buckets) count: capacity]; memset(buckets, 0, capacity * sizeof(*buckets)); } @catch (id e) { [self release]; @throw e; } return self; } | > > > > > > > > > > | 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 | minCapacity = capacity; buckets = [self allocMemoryWithSize: sizeof(*buckets) count: capacity]; memset(buckets, 0, capacity * sizeof(*buckets)); if (of_hash_seed != 0) { #if defined(OF_HAVE_ARC4RANDOM) seed = arc4random(); #elif defined(OF_HAVE_RANDOM) seed = random(); #else seed = rand(); #endif } } @catch (id e) { [self release]; @throw e; } return self; } |
︙ | ︙ | |||
220 221 222 223 224 225 226 | @try { uint32_t i; for (i = 0; i < capacity; i++) if (buckets[i] != NULL && buckets[i] != &deleted) [copy OF_setValue: buckets[i]->value forKey: buckets[i]->key | | | 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 | @try { uint32_t i; for (i = 0; i < capacity; i++) if (buckets[i] != NULL && buckets[i] != &deleted) [copy OF_setValue: buckets[i]->value forKey: buckets[i]->key hash: buckets[i]->hash ^ seed]; } @catch (id e) { [copy release]; @throw e; } copy->minCapacity = MIN_CAPACITY; |
︙ | ︙ | |||
245 246 247 248 249 250 251 | uint32_t i, hash, last; if (key == NULL) @throw [OFInvalidArgumentException exceptionWithClass: [self class] selector: _cmd]; | | | 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 | uint32_t i, hash, last; if (key == NULL) @throw [OFInvalidArgumentException exceptionWithClass: [self class] selector: _cmd]; hash = keyFunctions.hash(key) ^ seed; last = capacity; for (i = hash & (capacity - 1); i < last && buckets[i] != NULL; i++) { if (buckets[i] == &deleted) continue; if (keyFunctions.equal(buckets[i]->key, key)) |
︙ | ︙ | |||
345 346 347 348 349 350 351 352 353 354 355 356 357 358 | if (key == NULL || value == NULL) @throw [OFInvalidArgumentException exceptionWithClass: [self class] selector: _cmd]; last = capacity; for (i = hash & (capacity - 1); i < last && buckets[i] != NULL; i++) { if (buckets[i] == &deleted) continue; if (keyFunctions.equal(buckets[i]->key, key)) break; | > | 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 | if (key == NULL || value == NULL) @throw [OFInvalidArgumentException exceptionWithClass: [self class] selector: _cmd]; last = capacity; hash ^= seed; for (i = hash & (capacity - 1); i < last && buckets[i] != NULL; i++) { if (buckets[i] == &deleted) continue; if (keyFunctions.equal(buckets[i]->key, key)) break; |
︙ | ︙ | |||
439 440 441 442 443 444 445 | uint32_t i, hash, last; if (key == NULL) @throw [OFInvalidArgumentException exceptionWithClass: [self class] selector: _cmd]; | | | 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 | uint32_t i, hash, last; if (key == NULL) @throw [OFInvalidArgumentException exceptionWithClass: [self class] selector: _cmd]; hash = keyFunctions.hash(key) ^ seed; last = capacity; for (i = hash & (capacity - 1); i < last && buckets[i] != NULL; i++) { if (buckets[i] == &deleted) continue; if (keyFunctions.equal(buckets[i]->key, key)) { |
︙ | ︙ |