Хэш-код Java на основе идентификационных данных

Что касается того, как справиться с ограничением размера пути в Windows - использование 7zip для упаковки (и распаковки) ваших файлов, чувствительных к длине пути, кажется приемлемым обходным путем. Я использовал его для переноса нескольких инсталляций IDE (эти пути к подключаемым модулям Eclipse, yikes!) И груды автоматически сгенерированной документации, и до сих пор не было ни одной проблемы.

Не совсем уверен, как он уклоняется от ограничения в 260 символов, установленного Windows (из технической точки зрения), но эй, это работает!

Более подробная информация на их странице SourceForge здесь :

«NTFS может фактически поддерживать имена путей длиной до 32 000 символов.»

7 -zip также поддерживает такие длинные имена.

Но это отключено в коде SFX. Некоторым пользователям не нравятся длинные пути, так как они не понимают, как с ними работать. Вот почему я отключил его в коде SFX.

и заметки о выпуске :

9.32 alpha 2013-12-01

  • Улучшена поддержка имен файлов длиннее 260 символов .

4.44 beta 2007-01-20

  • 7-Zip теперь поддерживает имена файлов длиннее 260 символов.

ВАЖНОЕ ПРИМЕЧАНИЕ: Чтобы это работало правильно, вам нужно указать путь назначения в диалоговом окне «Извлечь» 7zip напрямую, а не перетаскивание & amp; сбросив файлы в нужную папку. В противном случае папка «Temp» будет использоваться в качестве промежуточного кэша, и вы попадете в то же ограничение в 260 символов, как только Windows Explorer начнет перемещать файлы в их «окончательное место покоя». См. Ответы на на этот вопрос для получения дополнительной информации.

11
задан hjfreyer 30 June 2009 в 13:22
поделиться

3 ответа

System.identityHashCode (Object) обеспечивает такое поведение.

Вы должны написать следующее:

class B extends A {
  public int hashCode() {
    return System.identityHashCode(this);
  }
}

Пожалуйста, проверьте метод equals, он возвращает true, только если два объекты такие же. В противном случае будет нарушено поведение, описанное для , равного и hashCode . (Чтобы быть правильным, метод equals должен возвращать false, если вы получаете разные хэш-коды для двух объектов.) Чтобы обеспечить реализацию equals (), которая соответствует данному методу hashCode ():

public boolean equals(Object other){
   return this == other;
}
26
ответ дан 3 December 2019 в 01:53
поделиться

Используйте System.identityHashCode () . Это то, что использует IdentityHashMap .

Вам следует крайне опасаться переопределения существующего hashCode () , потому что вы можете нарушить контракт hashCode, это два объекта, которые:

если a.equals (b), то a.hashCode () должен быть равен b.hashCode ()

Вы можете нарушить это, переопределив существующее поведение, или вам может потребоваться переопределить equals () тоже.

9
ответ дан 3 December 2019 в 01:53
поделиться

Как все сказал Мнемент, я просто хотел бы отметить, что hashCode (), возвращающий 0 (или любое постоянное значение), действителен (пока не работает). hashCode () может (и должен) возвращать разные значения для a и b, только если! a.equals (b).
Так, например, у вас есть

class A {
  public int hashCode() {
    return 0;
  }
  public boolean equals(Object o) {
    return o instanceof A; // all objects are equal
  }
}

class B extends A {
  public int hashCode() {
    return System.identityHashCode(this);
  }
  public boolean equals(Object o) {
    return this.hashCode().equals(o.hashCode());
  }
}

. Теперь вы создаете два объекта:

A a = new A();
A b = new B();

И вдруг a.equals (b), но! B.equals (a). Конечно, в реальной жизни equals () в A будет более сложным, но проблема все еще сохраняется. Чтобы избавиться от этой проблемы, вы хотите всегда вызывать

if (super.equals(o)) return true;

в начале new equals ().

А поскольку переопределение hashCode () строго привязано к переопределению equals (), вы хотите убедиться, что везде super. equals () вернет true для любых двух заданных объектов, new hashCode () вернет super.hashCode ().

1
ответ дан 3 December 2019 в 01:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: