Applies a supplemental hash function to a given hash code, which defends against poor quality hash functions. This is critical when the concurrent hash map uses power-of-two length hash tables, that otherwise encounter collisions for hash codes that do not differ in lower or upper bits. @param h ha
(int h)
| 1679 | * @param h hash code |
| 1680 | */ |
| 1681 | static int rehash(int h) { |
| 1682 | // Spread bits to regularize both segment and index locations, |
| 1683 | // using variant of single-word Wang/Jenkins hash. |
| 1684 | // TODO(kevinb): use Hashing/move this to Hashing? |
| 1685 | h += (h << 15) ^ 0xffffcd7d; |
| 1686 | h ^= h >>> 10; |
| 1687 | h += h << 3; |
| 1688 | h ^= h >>> 6; |
| 1689 | h += (h << 2) + (h << 14); |
| 1690 | return h ^ (h >>> 16); |
| 1691 | } |
| 1692 | |
| 1693 | /** |
| 1694 | * This method is a convenience for testing. Code should call {@link Segment#newEntry} directly. |