- 
                Notifications
    
You must be signed in to change notification settings  - Fork 318
 
Closed
Description
While playing AoC 2020 I've encountered a very strange issue  with HashSet::contains() -  it reports that an item is NOT present in the set, although it is. Here is a MCVE:
use std::collections::VecDeque;
//use std::collections::HashSet;
use hashbrown::HashSet;
pub fn main() {
    let mut deque = (0..10).collect::<VecDeque<usize>>();
    let mut seen_a = HashSet::new();
    let mut seen_b = HashSet::new();
    for i in 0..100 {
        if !seen_a.insert(deque.clone()) {
            if !seen_b.contains(&deque) {
                println!("{:3}: {:?}", i, deque);
            }
        }
        // already inserted
        // seen_a.insert(deque.clone());
        seen_b.insert(deque.clone());
        deque.rotate_left(1);
    }
}Expected behavior:
The application does not print anything
Actual behavior
The application prints:
 10: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
 11: [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
 12: [2, 3, 4, 5, 6, 7, 8, 9, 0, 1]
 13: [3, 4, 5, 6, 7, 8, 9, 0, 1, 2]
 14: [4, 5, 6, 7, 8, 9, 0, 1, 2, 3]
 15: [5, 6, 7, 8, 9, 0, 1, 2, 3, 4]
 23: [3, 4, 5, 6, 7, 8, 9, 0, 1, 2]
 24: [4, 5, 6, 7, 8, 9, 0, 1, 2, 3]
 25: [5, 6, 7, 8, 9, 0, 1, 2, 3, 4]
 26: [6, 7, 8, 9, 0, 1, 2, 3, 4, 5]
 27: [7, 8, 9, 0, 1, 2, 3, 4, 5, 6]
 28: [8, 9, 0, 1, 2, 3, 4, 5, 6, 7]
 29: [9, 0, 1, 2, 3, 4, 5, 6, 7, 8]
 30: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
 31: [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
 39: [9, 0, 1, 2, 3, 4, 5, 6, 7, 8]
 40: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
 41: [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
 42: [2, 3, 4, 5, 6, 7, 8, 9, 0, 1]
 43: [3, 4, 5, 6, 7, 8, 9, 0, 1, 2]
 44: [4, 5, 6, 7, 8, 9, 0, 1, 2, 3]
 45: [5, 6, 7, 8, 9, 0, 1, 2, 3, 4]
 46: [6, 7, 8, 9, 0, 1, 2, 3, 4, 5]
 47: [7, 8, 9, 0, 1, 2, 3, 4, 5, 6]
 55: [5, 6, 7, 8, 9, 0, 1, 2, 3, 4]
 56: [6, 7, 8, 9, 0, 1, 2, 3, 4, 5]
 57: [7, 8, 9, 0, 1, 2, 3, 4, 5, 6]
 58: [8, 9, 0, 1, 2, 3, 4, 5, 6, 7]
 59: [9, 0, 1, 2, 3, 4, 5, 6, 7, 8]
 60: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
 61: [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
 62: [2, 3, 4, 5, 6, 7, 8, 9, 0, 1]
 63: [3, 4, 5, 6, 7, 8, 9, 0, 1, 2]
 71: [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
 72: [2, 3, 4, 5, 6, 7, 8, 9, 0, 1]
 73: [3, 4, 5, 6, 7, 8, 9, 0, 1, 2]
 74: [4, 5, 6, 7, 8, 9, 0, 1, 2, 3]
 75: [5, 6, 7, 8, 9, 0, 1, 2, 3, 4]
 76: [6, 7, 8, 9, 0, 1, 2, 3, 4, 5]
 77: [7, 8, 9, 0, 1, 2, 3, 4, 5, 6]
 78: [8, 9, 0, 1, 2, 3, 4, 5, 6, 7]
 79: [9, 0, 1, 2, 3, 4, 5, 6, 7, 8]
 87: [7, 8, 9, 0, 1, 2, 3, 4, 5, 6]
 88: [8, 9, 0, 1, 2, 3, 4, 5, 6, 7]
 89: [9, 0, 1, 2, 3, 4, 5, 6, 7, 8]
 90: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
 91: [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
 92: [2, 3, 4, 5, 6, 7, 8, 9, 0, 1]
 93: [3, 4, 5, 6, 7, 8, 9, 0, 1, 2]
 94: [4, 5, 6, 7, 8, 9, 0, 1, 2, 3]
 95: [5, 6, 7, 8, 9, 0, 1, 2, 3, 4]
The issue is NOT reproducible with std::collections::HashSet. Just comment out the hashbrown import and uncomment the std one.
Hashbrown version: 0.9.1
rustc 1.48.0 (7eac88abb 2020-11-16)
Metadata
Metadata
Assignees
Labels
No labels