iphone - ¿NSSet usa el hash para definir la singularidad?
objective-c cocoa-touch (2)
Me gustaría intervenir y dar más información sobre el uso de hash
y isEqual:
ya que recientemente he encontrado errores extraños y descubrí que se debían a que yo había pasado por alto el hash
.
Cuando almacena objetos personalizados en un conjunto, NSSet utiliza el valor devuelto por su método hash
para agrupar objetos en distintos contenedores, en los que se comparan entre sí utilizando su método isEqual:
respectivo. Básicamente, siempre se hash
en su objeto al insertar, construir, probar la membresía, etc., y si este objeto cae en un contenedor donde hay otros objetos, su método isEqual
se usará para distinguirlo de ellos.
Es por eso que el hash
siempre debe ser el mismo para los objetos considerados iguales y, en la medida de lo posible, valores de distribución que distribuyan los objetos de manera uniforme. La última propiedad garantiza que los contenedores sean lo más pequeños posible, minimizando las llamadas a isEqual:
He estado trabajando bajo el supuesto de que NSSet usaba hash para buscar posibles coincidencias, y luego llamé a isEqual en cada una de ellas para verificar si había colisiones reales, pero me di cuenta de que no puedo encontrar ninguna evidencia que respalde esto.
La razón por la que lo menciono es la existencia del método "miembro:" en NSSet. ¿Por qué la documentación para miembro: se desvía de su camino para especificar que isEqual: se usa para encontrar su objeto cuando nada más lo hace en NSSet? ¿Contiene objetosObjeto: solo usa el hash o algo?
¿Alguien puede confirmar este comportamiento? ¿E idealmente, la documentación de referencia en él?
Sugeriría leer Temas de programación de colecciones , específicamente la sección ''Conjuntos: Colecciones de objetos no ordenados''. Allí encontrarás la siguiente información:
Esta información de rendimiento asume implementaciones adecuadas para el método hash definido para los objetos. Con una función de hash incorrecta, el acceso y las ediciones llevan tiempo lineal.
y
Los objetos en un conjunto deben responder al hash de métodos de protocolo NSObject y isEqual: (vea NSObject para más información). Si los objetos mutables se almacenan en un conjunto, el método hash de los objetos no debe depender del estado interno de los objetos mutables o los objetos mutables no deben modificarse mientras están en el conjunto. Por ejemplo, un diccionario mutable se puede poner en un conjunto, pero no debe cambiarlo mientras esté allí. (Tenga en cuenta que puede ser difícil saber si un objeto dado está o no en una colección).