Существует ли структура данных, которая хранит только хэш-коды, а не реальные объекты?

Мой вариант использования заключается в том, что я ищу структуру данных в Java, которая позволила бы мне увидеть, находится ли внутри объект с таким же хеш-кодом (с помощью метода contains()), но мне никогда не понадобится перебирать элементы или получить фактические объекты. HashSet близок, но, насколько я понимаю, он все еще содержит ссылки на реальные объекты, и это было бы пустой тратой памяти, поскольку мне никогда не понадобится содержимое реальных объектов. Лучший вариант, который я могу придумать, - это HashSet типа Integer, хранящий только хэш-коды, но мне интересно, есть ли встроенная структура данных, которая могла бы выполнять то же самое (и принимать только один тип в отличие от HashSet введите Integer, который будет принимать хеш-код любого объекта).

Ответы

Ответ 1

Фильтр Блума может сказать, может ли объект быть членом или определенно не является членом. Вы можете контролировать вероятность ложных срабатываний. Каждое значение хеша отображается в один бит.

Библиотека Guava обеспечивает реализацию на Java.

Ответ 2

Вы можете использовать реализацию примитивной коллекции, например IntSet, для хранения значений хеш-кодов. Очевидно, как уже упоминали другие, это предполагает, что столкновения не являются проблемой.

Ответ 3

Если вы хотите отследить, если хеш-код уже существует, и сделать его эффективным для использования памяти, BitSet может удовлетворить ваши требования.

Посмотрите на следующий пример:

  public static void main(String[] args) {
    BitSet hashCodes = new BitSet();
    hashCodes.set("1".hashCode());

    System.out.println(hashCodes.get("1".hashCode())); // true
    System.out.println(hashCodes.get("2".hashCode())); // false
  }

BitSet "реализует вектор битов, который увеличивается по мере необходимости". , Это JDK "встроенная структура данных", которая не содержит "ссылок на реальные объекты". Он хранится только в том случае, если "тот же хеш-код внутри".

РЕДАКТИРОВАТЬ:
Как отметил @Steve в своем комментарии, реализация BitSet не самая эффективная в BitSet памяти. Но есть более эффективные реализации памяти набора битов - хотя и не встроенные.

Ответ 4

Нет такой встроенной структуры данных, потому что такая структура данных требуется редко. Это легко построить, хотя.

public class HashCodeSet<T> {

    private final HashSet<Integer> hashCodes;        

    public MyHashSet() {
        hashCodes = new HashSet<>();
    }         

    public MyHashSet(int initialCapacity) {
        hashCodes = new HashSet<>(initialCapacity);
    }         

    public HashCodeSet(HashCodeSet toCopy) {
        hashCodes = new HashSet<>(toCopy.hashCodes);
    } 

    public void add(T element) {
       hashCodes.add(element.hashCode());
    }

    public boolean containsHashCodeOf(T element) {
       return hashCodes.contains(element.hashCode());
    }        

    @Override
    public boolean equals(o: Object) {
        return o == this || o instanceof HashCodeSet && 
                ((HashCodeSet) o).hashCodes.equals(hashCodes);
    }        

    @Override
    public int hashCode() {
        return hashCodes.hashCode(); // hash-ception
    } 

    @Override
    public String toString() {
        return hashCodes.toString();
    }
}