--- a/net/minecraft/world/level/block/state/properties/Property.java
+++ b/net/minecraft/world/level/block/state/properties/Property.java
@@ -24,6 +24,17 @@
         );
     private final Codec<Property.Value<T>> valueCodec = this.codec.xmap(this::value, Property.Value::value);
 
+    // Paper start - optimise iblockdata state lookup
+    private static final java.util.concurrent.atomic.AtomicInteger ID_GENERATOR = new java.util.concurrent.atomic.AtomicInteger();
+    private final int id = ID_GENERATOR.getAndIncrement();
+
+    public final int getId() {
+        return this.id;
+    }
+
+    public abstract int getIdFor(final T value);
+    // Paper end - optimise state lookup
+
     protected Property(String name, Class<T> type) {
         this.clazz = type;
         this.name = name;
@@ -70,7 +81,7 @@
 
     @Override
     public boolean equals(Object object) {
-        return this == object || object instanceof Property<?> property && this.clazz.equals(property.clazz) && this.name.equals(property.name);
+        return this == object; // Paper - Perf: Optimize hashCode/equals
     }
 
     @Override
