/ / È un modo fattibile per confrontare due valori di oggetti java usando l'hash md5? - java, json, confronta, md5

È un modo fattibile per confrontare due valori di oggetti java usando l'hash md5? - java, json, confronta, md5

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 № 1

Per 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.