PCharon Δημοσ. 1 Απριλίου 2009 Δημοσ. 1 Απριλίου 2009 Θελω να συγκρινω δυο αρχεια μονο, οχι πολλα μαζι, αλλα θελω σε λιγα δευτερολεπτα να εχω το αποτελεσμα τη συγκρισης. Φυσικα θελω αξιοπιστια γιατι εστω και 1 byte να αλλαζει τοτε τα αρχεια ειναι διαφορετικα. Ωραία λοιπόν, ΔΥΟ αρχεία (όσο πιο συγκεκριμένο το κάνεις, τόσο πιο χρήσιμη απάντηση θα παίρνεις). Άρα ο γρηγορότερος τρόπος είναι ΣΙΓΟΥΡΑ η σύγκριση byte-to-byte με χρήση κάποιου buffer (πχ 5-10ΜΒ ανά αρχείο τουλάχιστον, μνήμη υπάρχει αρκετή πια σε όλα τα συστήματα). Αν σε ενδιαφέρει ως αποτέλεσμα μόνο το αν είναι ίδια ή όχι, σταματάς μόλις βρεθεί byte που διαφέρει. Εννοείται από την αρχή πως τσεκάρεις πρώτα το μέγεθος (το αν θα συνεχίσεις σε περίπτωση διαφορετικού μεγέθους, εξαρτάται αν θες να βρεις τα κουτσουρουμένα αρχεία). Στο site της υπογραφής μου έχω φτιάξει από παλιά το "File Comparator" που λειτουργεί ακριβώς με αυτόν τον τρόπο. Βέβαια είναι σε C, όχι σε VB, οπότε δεν μπορώ να σε βοηθήσω σε κώδικα.
ntaryl Δημοσ. 1 Απριλίου 2009 Δημοσ. 1 Απριλίου 2009 Τσεκαρισε αυτο φιλε http://www.pscode.com/vb/scripts/BrowseCategoryOrSearchResults.asp?lngWId=1&B1=Quick+Search&txtCriteria=COMPARE+FILES&blnWorldDropDownUsed=TRUE&txtMaxNumberOfEntriesPerPage=10&blnResetAllVariables=TRUE&optSort=Alphabetical
Evgenios1 Δημοσ. 1 Απριλίου 2009 Δημοσ. 1 Απριλίου 2009 Για γρηγορο τσεκαρισμα. Αρχειο Α Αρχειο Β Αν Μεγεθος(Α) Δεν ειναι ισο Μεγεθος(Β) Τοτε Αποτελεσμα: Δεν ειναι ιδια Αν ΔοσεΚοματι(Α,(απο) Μεγεθος(Α)/2,(μεχρι) (Μεγεθος(Α)/2)+4) Δεν ειναι ισο με ΔοσεΚοματι(Β,(απο) Μεγεθος(Β)/2,(μεχρι) (Μεγεθος(Β)/2)+4) Και ΔοσεΚοματι(Α,(απο) Μεγεθος(Α)/4,(μεχρι) (Μεγεθος(Α)/4)+4) Δεν ειναι ισο με ΔοσεΚοματι(Β,(απο) Μεγεθος(Β)/4,(μεχρι) (Μεγεθος(Β)/4)+4) Και ΔοσεΚοματι(Α,(απο) Μεγεθος(Α)/8,(μεχρι) (Μεγεθος(Α)/8)+4) Δεν ειναι ισο με ΔοσεΚοματι(Β,(απο) Μεγεθος(Β)/8,(μεχρι) (Μεγεθος(Β)/8)+4) Τοτε: Δεν ειναι ιδια Τελος το κανεις Byte to Byte
parsifal Δημοσ. 1 Απριλίου 2009 Δημοσ. 1 Απριλίου 2009 Δε βλέπω μειωμένη πολυπλοκότητα στον παραπάνω αλγόριθμο, σε σχέση με τη byte προς byte σύγκριση.
Evgenios1 Δημοσ. 1 Απριλίου 2009 Δημοσ. 1 Απριλίου 2009 Στηριζετε στοις πιθανοτητς. ενα byte εχει 255 τημες, αρα 255*4 = 1020 πιθανοτητες αρα 1/1020 να πετυχεις και το παραπανω το κανεις σε 3 σημεια, λιγο δυσκολο να το πετυχεις
parsifal Δημοσ. 1 Απριλίου 2009 Δημοσ. 1 Απριλίου 2009 Δεν κατάλαβα την εξήγηση που δίνεις. Κατά πρώτον, ένα byte έχει 256 δυνατές τιμές και όχι 255 (όχι πως έχει ιδιαίτερη σημασία). Και κατά δεύτερον, ξεκινώντας μία byte προς byte σύγκριση ήδη στα πρώτα 3 ζεύγη bytes έχεις κάνει σύγκριση 3 θέσεων-σημείων και η πιθανότητα αυτά να είναι ίδια ή διαφορετικά δεν υπάρχει λόγος να είναι διαφορετική σε σχέση με την περίπτωση που θα επέλεγες τα 3 σημεία που ανέφερες.
ippo00 Δημοσ. 1 Απριλίου 2009 Δημοσ. 1 Απριλίου 2009 Πέρα από την χρήση μεγέθους αρχείου απλά προσθέτεις πολυπλοκότητα.
ippo00 Δημοσ. 1 Απριλίου 2009 Δημοσ. 1 Απριλίου 2009 Well, στην πράξη όταν θα κάνει byte to byte θα ξαναγίνει έλεγχος των bytes που τσέκαρε τυχαία. Αλλά ok είναι σχεδόν ίδια
Evgenios1 Δημοσ. 1 Απριλίου 2009 Δημοσ. 1 Απριλίου 2009 Οταν καινεις Seek με εναν streamreader, αυτος διαβαζει ολα τα byte μεχρι το σημειο που εκανες seek?
Evgenios1 Δημοσ. 2 Απριλίου 2009 Δημοσ. 2 Απριλίου 2009 Έχει seek το streamreader? Εννοω κατι το οποιο μπορει να διαβασει..... πχ MemoryStream FileStream
geo1st487 Δημοσ. 2 Απριλίου 2009 Μέλος Δημοσ. 2 Απριλίου 2009 Απ'οτι διαβασα το checksum εχει αξιοπιστια 99.99%. Αν ισχυει αυτο τελικα τοτε ειμαι ικανοποιημενος.
georgemarios Δημοσ. 2 Απριλίου 2009 Δημοσ. 2 Απριλίου 2009 geo1st487 αν αυτο που θες ειναι 1. να συγκρινεις 2 (και μονο) αρχεια ΚΑΙ θελεις να εισαι απολυτα σιγουρος για το αποτελεσμα, η καλυτερη λυση ειναι byte-to-byte συγκριση. 2. να βρεις σε ενα φακελλο αν υπαρχουν αρχεια που ειναι ιδια μεταξυ τους (εγω αυτο καταλαβα στην αρχη) τοτε ειναι πιο γρηγορο (ισως) το checksum γιατι αντι να συγκρινεις το καθε αρχειο με ολα τα υπολοιπα, κανεις ενα checksum στο καθενα και συγκρινεις τα checksums μεταξυ τους (γρηγοροτερο) διαλεγεις αναλογα το προβλημα
PCharon Δημοσ. 2 Απριλίου 2009 Δημοσ. 2 Απριλίου 2009 2. να βρεις σε ενα φακελλο αν υπαρχουν αρχεια που ειναι ιδια μεταξυ τους (εγω αυτο καταλαβα στην αρχη) τοτε ειναι πιο γρηγορο (ισως) το checksum γιατι αντι να συγκρινεις το καθε αρχειο με ολα τα υπολοιπα, κανεις ενα checksum στο καθενα και συγκρινεις τα checksums μεταξυ τους (γρηγοροτερο) Η μόνη περίπτωση να είναι γρηγορότερο είναι αν τα - πολλά - αρχεία είναι σχεδόν αντίγραφα και τα ελάχιστα διαφορετικά τους bytes βρίσκονται προς το τέλος των αρχείων. Μιλάμε τώρα για "περίπτωση". Στην κακή περίπτωση που τα αρχεία είναι μεγάλα σε μέγεθος αλλά διαφέρουν σε μερικά σημεία, το να υπολογίζεις checksum μπορεί να πάρει 100πλάσιο χρόνο (και λίγο λέω) από τον απευθείας έλεγχο των bytes. Πάντως, σίγουρα για κάποιον αρχάριο είναι πάρα πολύ ευκολότερο να υλοποιήσει επιτυχώς τη λύση με τα checksums. (Ένας από τους λόγους που τα περισότερα αντι-duplicate προγράμματα που κυκλοφορούν είναι GTP.) Τα πλεονεκτήματα της μεθόδου υπολογισμού checksum έχουν εφαρμογή σε τελείως άλλα πράγματα.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.