Ad esempio, ho due oggetti, che è una classe, Person.
Person A:
User_name:n1
Password:1234
Email:n1@email.com
Person B:
User_name:n1
Password:1234
Email:n1@email.com
Perché sia la persona A che la persona B hanno lo stessovalori, quindi, vorrei scrivere la mia funzione isValueEqual. per prima cosa, voglio confrontare le loro classi, poi, mi accampo il loro valore uno per uno per verificare se è uguale. Penso che questo modo richieda molto tempo. Quindi, penso che sia affidabile per farlo diventare una stringa JSON, e usare md5 per cancellarli e confrontare solo l'hash. Quindi, si tratta di un approccio migliore per confrontare il loro valore? Grazie.
risposte:
2 per risposta № 1Per spiegare ciò che Jim Garrison spiega in questocommentare più in dettaglio, basta considerare il lavoro necessario per implementare uguali confrontando i campi e il lavoro necessario per implementarlo generando un hash e confrontando gli hash. Facciamo il tuo esempio, con A e B che differiscono solo per l'ultima lettera della loro e-mail (che è il caso peggiore).
Primo metodo:
- scorrere tutti i caratteri del nome e confrontarli
- scorrere tutti i caratteri della password e confrontarli
- scorrere tutti i caratteri e-mail e confrontarli.
Secondo metodo:
- crea due nuovi StringBuilders
- scorrere tutti i caratteri del nome per inserire il nome nelle stringhe JSON e aggiungerli a StringBuilder, racchiuso tra virgolette, con caratteri speciali scappati, ecc.
- scorrere tutti i caratteri della password per inserire la password nelle stringhe JSON e aggiungerli a StringBuilder, racchiuso tra virgolette, con caratteri speciali esclusi, ecc.
- scorrere tutti i caratteri dell'email per riempire l'e-mail nelle stringhe JSON e aggiungerli allo StringBuilder, racchiuso tra virgolette, con caratteri speciali scappati, ecc.
- trasforma StringBuilders in stringhe
- trasforma le stringhe in array di byte
- applica una complessa funzione crittografica ad entrambi gli array di byte
- scorrere ogni array di byte e confrontare i byte.
Nota che se le persone differiscono per il primo carattere o la lunghezza del loro nome, il primo metodo si interrompe immediatamente, mentre il secondo deve fare ogni passo.
5 per risposta № 2
No. Puoi incontrare a collisione di hash e quindi identificare due oggetti diversi come uguali.
Che tempo impiega a confrontare i campi? Se sei preoccupato per il tempo di calcolo, misuralo prima (sarei molto sorpreso se pensi che sia troppo lento e un calcolo dell'hash sarà notevolmente più lento). Se sei preoccupato per i tempi di implementazione, dai un'occhiata Apache Commons EqualsBuilder o simili.
0 per risposta № 3
La funzione hash ti dà falsi positivi, quindi è probabile che alla fine colpisca il falso abbinamento.
Sebbene se i tuoi oggetti non esauriranno MD5 e il falso abbinamento non ti disturba, sicuramente puoi optare per MD5.
0 per risposta № 4
Qualcosa del genere è molto più veloce della conversione dell'oggetto in JSON e quindi del calcolo del suo MD5
public boolean equals( Object o ) {
Person p = null;
return o instanceof Person
&& this.name.equals((p = (Person) o).name)
&& this.password.equals(p.password)
&& this.email.equals(p.email);
}
Ma non credermi, misura.