Tengo un formulario con un área de texto que puede contener grandes cantidades de contenido (por ejemplo, artículos para un blog) editado utilizando uno de varios editores de texto enriquecido de terceros. Estoy tratando de implementar algo así como una característica de autoguardado, que debe enviar el contenido a través de ajax si se cambia. Sin embargo, tengo que evitar el hecho de que algunos de los editores que tengo como opciones no admiten un indicador "isdirty" o un evento "onchange" que pueda usar para ver si el contenido ha cambiado desde el último guardado.Comparación de cadenas grandes en JavaScript con un hash
Así que, como solución, lo que me gustaría hacer es mantener una copia del contenido en una variable (llamémoslo lastSaveContent), desde el último guardado, y compararlo con el texto actual cuando el " autoguardar "la función se dispara (en un temporizador) para ver si es diferente. Sin embargo, me preocupa cuánta memoria podría ocupar con documentos muy grandes.
¿Sería más eficiente almacenar algún tipo de hash en la variable lastSaveContent, en lugar de toda la cadena, y luego comparar los valores de hash? Si es así, ¿puedes recomendar un buen plugin de biblioteca/jquery de JavaScript que implemente un hash apropiado para este requisito?
Probablemente nunca ocurra en su caso de uso, pero para el lector casual que aterriza aquí en busca de javascript y hash (como yo), podría valer la pena señalar que comparar dos valores hash es * no * el Al igual que la comparación de dos cadenas, hash puede (y voluntad) colisionar, es decir, el mismo hash para dos cadenas diferentes. Por lo tanto, en muchos casos de uso, debe realizar una comparación completa si obtiene el mismo valor hash de todos modos. –
Buen punto. Además, en caso de que los lectores se pregunten, la razón por la que los objetos Hashtable, como los encontrados en muchas API de colecciones, aún funcionan a pesar de esto es porque contienen funcionalidad para manejar estas colisiones cuando dos claves producen el mismo hash. – user4815162342