diff --git a/src/main/java/org/jboss/jandex/AnnotationInstance.java b/src/main/java/org/jboss/jandex/AnnotationInstance.java
index 147a4889..91f9b660 100644
--- a/src/main/java/org/jboss/jandex/AnnotationInstance.java
+++ b/src/main/java/org/jboss/jandex/AnnotationInstance.java
@@ -324,8 +324,7 @@ void setTarget(AnnotationTarget target) {
/**
* Returns whether or not this annotation instance is equivalent to another instance.
* An annotation instance is equivalent if its name and values are equal, and it shares
- * the exact same AnnotationTarget
instance. The latter restriction
- * may be softened in future versions.
+ * the exact same AnnotationTarget
instance.
*
* @param o the annotation instance to compare to.
* @return true if equal, false if not
@@ -353,6 +352,36 @@ public int hashCode() {
int result = name.hashCode();
result = 31 * result + Arrays.hashCode(values);
+ if (target != null) {
+ switch (target.kind()) {
+ case CLASS:
+ result = 31 * result + target.asClass().name().hashCode();
+ break;
+ case METHOD:
+ result = 31 * result + target.asMethod().declaringClass().name().hashCode();
+ result = 31 * result + target.asMethod().name().hashCode();
+ break;
+ case FIELD:
+ result = 31 * result + target.asField().declaringClass().name().hashCode();
+ result = 31 * result + target.asField().name().hashCode();
+ break;
+ case METHOD_PARAMETER:
+ result = 31 * result + target.asMethodParameter().method().declaringClass().name().hashCode();
+ result = 31 * result + target.asMethodParameter().method().name().hashCode();
+ result = 31 * result + target.asMethodParameter().position();
+ break;
+ case RECORD_COMPONENT:
+ result = 31 * result + target.asRecordComponent().declaringClass().name().hashCode();
+ result = 31 * result + target.asRecordComponent().name().hashCode();
+ break;
+ case TYPE:
+ if (target.asType().target() != null) {
+ result = 31 * result + target.asType().target().name().hashCode();
+ }
+ break;
+ }
+ }
+
return result;
}
}