Si tengo una cadena inmutable, ¿se ejecuta el algoritmo hashing cada vez que llamo hash, o recuerda el valor (dado que la cadena no puede cambiar)?¿Se ha calculado [hash NSString] cada vez?
Respuesta
Se vuelve a calcular.
- [NSString hash] es, de hecho, una llamada a - [NSCFString hash] (debido al puente libre de peaje).
Si crea un programa que llama a [NSString hash] en la misma cadena y se intercala entre las llamadas y altera la memoria haciendo una copia de seguridad de la cadena, obtendrá un valor hash recalculado. Esto me dice que no hay almacenamiento en caché.
(gdb) b -[NSCFString hash]
Breakpoint 1 at 0x3b02fa3
(gdb) r
Breakpoint 1, 0x93652fa3 in -[NSCFString hash]()
(gdb) c
Continuing.
2009-05-13 14:23:39.003 a.out[1754:813] Hash: -327163326
Tenga en cuenta el valor de hash.
Breakpoint 1, 0x93652fa3 in -[NSCFString hash]()
(gdb) bt
#0 0x93652fa3 in -[NSCFString hash]()
#1 0x00001f73 in main() at test.m:10
(gdb) fra 1
#1 0x00001f73 in main() at test.m:10
10 NSLog(@"Hash: %d", [m hash]);
(gdb) info locals
pool = (NSAutoreleasePool *) 0x109760
m = (NSString *) 0x2030
(gdb) x/20x 0x2030
0x2030 <dyld__mach_header+32>: 0xa06f54a0 0x000007c8 0x00001fa2 0x00000012
0xa06f54a0 es el puntero "ISA", 0x00001fa2 es un puntero a la cadena "XXXXXX".
(gdb) set {int}0x1fa2 = 0x59595959
alteran la cadena "XXXXXX" a "YYYYXXXX", y luego continuar a la segunda llamada de hash
(gdb) c
Continuing.
2009-05-13 14:24:35.884 a.out[1754:813] Hash: -246144954
Nota el valor hash que es diferente en la medida de lo ObjC sabe cadena inmutable.
El programa que he (de) molestó es:
#import <Cocoa/Cocoa.h>
int main()
{
NSAutoreleasePool * pool = [NSAutoreleasePool new];
NSString * m = [NSString stringWithString:@"XXXXXXXXXXXXXXXXXX"];
NSLog(@"Hash: %d", [m hash]);
NSLog(@"Hash: %d", [m hash]);
[pool release];
}
respuesta increíble. Gracias – Ian1971
Muy buena respuesta –
Alternativamente, puede mirar el código fuente de CFStringRef aquí: http://opensource.apple.com/source/CF/CF-476.17/CFString.c Buscar 'CFHashCode __CFStringHash (CFTypeRef cf) 'para la función que se llama. Tenga en cuenta que (a) hace las cosas de manera diferente para los búferes de cadenas de 8 bits y Unicode, y (b) solo tiene hashes hasta un cierto número de caracteres (actualmente 96). Busque '/ * Hash de cadena:' para ver los detalles del algoritmo de hash (s). –
- 1. Muchas iteraciones de hash: agregue sal cada vez?
- 2. ¿Hay en los sistemas de archivos de Windows un hash pre calculado para cada archivo?
- 3. ¿Se ha lanzado un NSString literal o se debe lanzar?
- 4. ¿Por qué mi hash MD5 calculado en .net no es equivalente al hash calculado en un sitio web?
- 5. Los contadores se inicializan cada vez?
- 6. ¿Se ha llamado al hook after_validation cada vez en Active Record?
- 7. cmake & gcc compila cada archivo cada vez
- 8. Pérdida de memoria cada vez que se lanza UIScrollView
- 9. ¿Alguna vez ha usado ngen.exe?
- 10. ¿Se calcula javascript str.length cada vez que se llama o solo una vez?
- 11. ¿Cómo obtengo cada línea de un NSString?
- 12. ¿Por qué se ha llamado al destructor una sola vez?
- 13. ¿Se ha admitido el selector :: - webkit-selection alguna vez?
- 14. Actividad se ha filtrado ventana/diálogo (¡esto otra vez!)
- 15. función de llamada automática cada vez que x
- 16. mySQL: obtener valor hash para cada fila?
- 17. Activación de una pista de audio HTML5 para reproducir cada vez que ha cargado
- 18. Julia compila el script cada vez?
- 19. método IOS canAuthenticateAgainstProtectionSpace no se llama cada vez que
- 20. Android en Eclipse se bloquea cada vez que abro main.xml
- 21. ¿Canvas se vuelve a dibujar cada vez que cambia algo?
- 22. versión de actualización cada vez que se hace git push?
- 23. ¿Por qué no se recomienda llamar a LoggerFactory.getLogger (...) cada vez?
- 24. UNIDAD: ¿se pasa un nuevo contexto de datos cada vez?
- 25. ¿Cómo puedo detectar cada vez que se superponen dos UIImageView?
- 26. glVertexAttribPointer necesario cada vez que se llama glBindBuffer?
- 27. UIScrollView llama a layoutSubviews() cada vez que se desplaza
- 28. Cron trabajo creando archivo vacío cada vez que se ejecuta
- 29. Android C2DM Auth token, una vez o cada vez
- 30. ¿Alguna vez ha bloqueado el compilador?
Bueno, para responder con otra pregunta, ¿por qué te importa? Si le preocupa el rendimiento, es evidente que se está preocupando demasiado pronto, ya que no tiene ningún código para el perfil y descubrirlo por sí mismo. Además, si Apple no documenta este comportamiento, podría cambiar felizmente en el futuro, por lo que no debería confiar en él. –
Quizás estuve interesado? – Ian1971