Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

João Batista Filho

Verificando se dois arquivos são iguais com porcentagem de precisão

Recommended Posts

[ ATUALIZADO ]

 

Como nosso amigo Carlos Coelho apontou abaixo o uso também de similar_text notem que:

 

A função similar_text não foi feita para o que estamos mostrando aqui por não suportar grande quantidade de dados e não é segura para binários

 

--------------------------------------------------------------------------

 

Primeiro gostaria de agradecer a todos, membros, equipe e desejar que o nome Imasters++ cresca cada vez mais

 

Agente está trazendo aqui uma solução para arquivos duplicados

 

Problema:

 

Um membro do seu site envia imagens ou outros arquivos, mas e se alguém começar a enviar o mesmo arquivo várias vezes o que você faria, alguém poderia usar CURL para enviar centenas de arquivos iguais e prejudicar seu servidor

 

 

Solução:

 

Assim como o youtube não deixa você enviar o mesmo vídeo duas vezes você também pode proibir essa ação para qualquer arquivo enviado para seu site.

 

Primeiro nos vamos verificar linha por linha se o arquivo enviado não é igual a outro e tudo isso com taxa de igualdade;

 

 

Arquivos suportados:

 

Todos os tipos

 

NA PRÁTICA:

 

Vamos ver na interface um pouco dos métodos usados

 

<?
interface equal_files{


/**
* Erros retornados em tempo de execução do script 
*/
const FILE_IS_NOT_ARRAY = '<strong>$File</strong> deve ser um array';

const FILE_MORE_THAN_2 = '<strong>$File</strong> Suporta a abertura de apenas dois arquivos por vez';

const FILES_NOT_EXIST = 'Um ou mais arquivos não foram encontrados';

const FILE_OPEN_FAIL = 'A abertura de um ou mais arquivos falhou';


/**
* abrindo arquivos para leitura
* @return handler
*/
public function open_handler();



/**
* lendo os arquivos
* @return array
*/
public function read_file();



/**
* Verificação final de igualdade
* @return integer
*/
public function is_equal();



/**
* Fechando arquivos abertos por open_handler();
* @return null
*/
public function close_handler();




} 

?>

 

EXEMPLO DE USO REAL:

 

 

<?
require('equal_class.php');

$equal = new equal; 

// Pode ser qualquer arquivo, aqui vamos usar imagen

$Arquivo_1 = '1.png';
$Arquivo_2 = '2.png';

$equal->File = array($Arquivo_1, $Arquivo_2);
$equal->init();

if($equal->Exact > $equal->Dividido_Por2) 

echo 'São os mesmos arquivos com uma precisão de '. $equal->Exact_PerCent .'% de acerto';

elseif($equal->Fail > $equal->Dividido_Por2) 

echo 'Não são iguais por que das '. $equal->Lines .' linhas do arquivos '. $equal->Fail_PerCent .'% são diferente(s)';


// OU exemplo de upload


if($equal->Exact > $equal->Dividido_Por2) 

move_uploaded_file($_FILES['NAME']['TEMP'], 'DESTINO');

elseif($equal->Fail > $equal->Dividido_Por2) 

echo 'ERRO: Você já enviou esse arquivo, tente outro';


?>

 

 

ARQUIVOS INCLUSOS:

 

 

- 3 imagens para teste

- equal_class.php

- equal_interface.php

- Exemplo.php

 

DOWNLOAD: link removido

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, também dá para fazer isso usando similar_text

 

<?php

similar_text( file_get_contents( 'file1.txt' ), file_get_contents( 'file2.txt' ), $percent );

printf( 'Similaridade dos arquivos: %s%%', $percent );

 

Se quiser calcular sem diferenciar maiúsculas de minúsculas (case-insensitive) é só usar strtolower ou strtoupper

<?php

similar_text( strtolower( file_get_contents( 'file1.txt' ) ), strtolower( file_get_contents( 'file2.txt' ) ), $percent );

printf( 'Similaridade dos arquivos: %s%%', $percent );

 

:thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites
Se quiser calcular sem diferenciar maiúsculas de minúsculas (case-insensitive) é só usar strtolower ou strtoupper

Na na ni na não.

 

Essas funções alteram a capitalização das letras.

 

A comparação correta ignorando maiúsculas e minúsculas deve ser feita com strcasecmp(), comparando o resultado com zero:

 

$str1 = 'bruno augusto';
$str2 = 'Bruno Augusto';

var_dump( $str1 == $str2, strcasecmp( $str1, $str2 ) == 0 );

O primeiro retorna FALSE e o segundo TRUE. :thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pegando a frase fora do seu contexto fica estranho mesmo usar strtoupper e strtolower. Mesmo não sendo para fazer aquele tipo de comparação que você citou.

 

Mas como usar similar_text sem diferenciar maiúsculas de minúsculas?

 

Talvez utilizando mb_strtolower ou mb_strtoupper :mellow:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu não consigo imaginar outro uso para simlar_text() que não seja algo em torno do "Você quis dizer..." do Google.

 

Se, e somente se, este for o caso, a solução mais adequada seria buscar num banco de dados todas as palavras cuja fonética, calculada com soundex(), coincidam com a da palavra digitada/recebida.

 

Uma vez com esse set de palavras e fonéticas, com um loop calcularia-se a distância levenshtein() da palavra digitada/recebida E da palavra da iteração corrente.

 

Feito isso, a palavra com a menor distância levenshtein é aquela que se procura.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu não consigo imaginar outro uso para simlar_text() que não seja algo em torno do "Você quis dizer..." do Google.

 

 

Você e o outro que disse

Cara, também dá para fazer isso usando similar_text

Nem testaram o sistema, testaram?

 

 

ATENÇÂO:

 

usar simlar_text() para testar arquivos é incorreto pois é SIMILAR_TEXT e não SIMILAR_FILE

 

simlar_text() para testar arquivos poderá tirar teu site do ar se você for testar em arquivos de ex: 100 K para cima

 

 

No caso do Google, estamos falando aqui de texto ou de arquivos?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Antes de vir com grosseria, porque você não se dá ao trabalho de no mínimo postar todos os arquivos para que possamos entender a implementação que você tinha em mente quando iniciou o tópico?

 

Comparação binária de arquivos existem aos montes na Internet, como por exemplo essa classe, que inclusive recebeu o prêmio de Inovação do PHPClasses que faz esse tipo de tarefa.

 

Pode não ser a melhor, não analisei a fundo, mas enfim...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Antes de vir com grosseria, porque você não se dá ao trabalho de no mínimo postar todos os arquivos para que possamos entender a implementação que você tinha em mente quando iniciou o tópico?

 

Desculpe amigo, já editei e removi palavras consideradas grosseiras, é assim mesmo cada um defende suas idéias afinal agente tem certo trabalho para fazer. Um abraço pra você e para todos.

 

Quanto a postar os arquivos, não seria legal afinal se alguma mudança for feita as pessoas terão aqui arquivos defasados e também não é apenas nesse site que o projeto foi postado

Compartilhar este post


Link para o post
Compartilhar em outros sites

O grande problema foi a remoção, talvez inadvertida, do link que você postou.

 

se a questão das atualizações for um problema, você pode postá-la no iMasters Code ou, se usar GitHub, postar o linkdo repositório, assim sempre todos poderão ter as versões atuais.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eles quiz dizer Não adianta nada você postar so a Interface pro pessoal.. kkkk

 

Deveria ta postada no laboratorio de scrips.. ja que sua intenção é disponibilizar sua class pra galera!

 

Eu quero testar sua Class.. Até consigo implementar alguns metodos da interface, porém is_equal(), a porca torce o rabo =X

 

para que a class não fique desatualizada, use GITHUB! la voce pode fazer o versionamento e sempre disponibilizar a versão atualizada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiramente a grosseria de remover um link para download do conteúdo e não avisar foi terrível

Eu pergunto qual foi o motivo que levou a remoção do link?

 

todos os fórums receberam bem a postagem e usaram e testaram o conteúdo, mas apenas aqui aconteceu isto

 

Se tiver um motivo plausível posso dar outro jeito de postar um novo download

Compartilhar este post


Link para o post
Compartilhar em outros sites

Poste um novo link que, se ninguém fizer antes, eu me disponho pessoalmente a adicioná-lo ao post inicial.

 

Apenas para que não hajam margens para uma nova remoção, atente apenas para duas coisas: A disponibilidade do link, isto é, estar de fato online e que o host escolhido não tenha nada que vá contra as Regras do Fórum, principal, mas não exclusivamente, com relação à pirataria, ---ografia, racismo e etc.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.