Y si le das una oportunidad a la de hacer los primeros 64k nada más? y cuando detectas una colisión, recién ahí vas probando con más?? Entonces, en el caso de que sean todos distintos, tarda un tiempo que sería mínimo. Cuando hay "sospechas" puede tardar un poco más... Me parece que así mantendrías un muy buen nivel de performance sin el compromiso que hay que aceptar cuando incorporás alguna heurística. Es muy difícil decidir alguna heurística que sirva, y peor aún, varía mucho entre distintos casos. Como ejercicio estaría bueno hacerlo configurable (el hashing por "niveles", digo). Por ejemplo, que si lo configurás con
niveles = [ 64 ] hashee apenas los 64kb primeros de cada archivo, y recién en una segunda instancia los archivos completos para despejar las dudas (sólo si coincidió el hash de primer nivel con algún otro, hasheo el archivo completo). Pero si lo configurás con niveles = [ 64, 10240 ] primero intente con 64kb, luego si hay sospechas con 10mb y recién si todavía pueden llegar a ser iguales con los archivos completos (esto serviría para el caso de tener muchos archivos muy grandes pero con probabilidad de que tengan un comienzo igual, se me ocurre que no es tan loco). Lo que hay que mantener es siempre todos los niveles de hash calculados (para comparar también incrementalmente) para todos los archivos (acá se cae el uso de un Hash, al menos como está usado actualmente). Por otro lado, si un hash (de primer nivel) da igual, pero las longitudes de los archivos son distintas, descartarlo (en este caso, tampoco sirve un Hash, al menos como está planteado), considerarlos archivos distintos (esto implicaría que en el caso de que tengas dos archivos uno siendo el otro truncado los consideraría distintos, cosa que de la otra forma se podría llegar a manejar). O quizá sea hora de largar la paja mental... :) On 9/1/07, nelson fernandez <[EMAIL PROTECTED]> wrote: > > Porque en vez de hacer un hash de 'todos' los archivos no solo hacerlo > de los que se podrian 'parecer' ?... agregarle más inteligencia al > algoritmo de búsqueda. > > por ejemplo, ver si hay 2 nombres iguales de archivos y usar el método > de hash para resolverlo. pero si los nombres son distintos y las > extensiones son distintas (comparar un ubuntu.iso con > mafalda_naked.jpg tiene sentido ?) no compararía. luego por cada grupo > de archivos (agrupados por extensiones ?) se podría usar el algoritmo > de levenshtein [1][2] para ver si tienen nombres parecidos y solo con > los que se acerquen mucho usar el método de calcular el hash. > me parece que en lotes grandes vas a obtener mejores resultados > > [1] http://www.merriampark.com/ld.htm > [2] http://rubyforge.org/projects/text > > > -- > :: nelson :: > artesano de software > http://netflux.com.ar > _______________________________________________ > Ruby mailing list > [email protected] > http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar >
_______________________________________________ Ruby mailing list [email protected] http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar
