Czy to powoduje wciągnięcie całego pliku do pamięci?
openfrog
Tu nie chodzi o pliki. Jeśli chcesz utworzyć MD5 z pliku za pomocą tych metod, możesz wykonać NSData * fileContents = [NSData dataWithContentsOfFile: @ "<yourPath>"]; NSString * myHash = [fileContents md5]; I tak, to spowodowałoby wciągnięcie całego pliku do pamięci. Jeśli znajdziesz rozwiązanie, które działa ze strumieniami plików, prześlij je jako odpowiedź.
Klaas
1
Jeśli potrzebujesz haszowania pliku, powinieneś użyć CC_MD5_Init, następnie CC_MD5_Update dla wszystkich danych pliku, a następnie - CC_MD5_Finish.
Nickolay Olshevsky
7
Kompilując dla architektury 64-bitowej, wywołanie strlendaje ostrzeżenie: „Niejawna konwersja traci precyzję liczby całkowitej: 'unsigned long' na 'CC_LONG' (aka 'unsigned int')”
MaxGabriel
55
W tym celu możesz skorzystać z wbudowanej biblioteki Common Crypto. Pamiętaj, aby zaimportować:
#import <CommonCrypto/CommonDigest.h>
i wtedy:
-(NSString*) md5:(NSString*) input{constchar*cStr =[input UTF8String];unsignedchar digest[CC_MD5_DIGEST_LENGTH];
CC_MD5( cStr, strlen(cStr), digest );// This is the md5 callNSMutableString*output =[NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH *2];for(int i =0; i < CC_MD5_DIGEST_LENGTH; i++)[output appendFormat:@"%02x", digest[i]];return output;}
Zaimplementowałem powyższy kod, ale podczas uruchamiania aplikacji dochodzi do awarii (CC_MD5 (cStr, strlen (cStr), digest) ----> ta linia rzuca wyjątek mówiąc: EXC_BAD_ACCESS)
Nilesh Kumar
@wimcNilesh sprawdź selfprzed wykonaniem; jeśli self jest zerowe, to się rozbije.
brandonscript
4
Ta odpowiedź jest dużo bardziej czytelna niż inne; jedyną rzeczą, jakiej potrzebuje, jest obsada, (int)zanim strlennp. (int)strlen...
brandonscript
Hay To fajne +1 upvote, I czy możesz również podać metodę deszyfrowania md5 taką samą, jak szyfrowanie twojego.
Ayaz
@Ayaz MD5 nie można odszyfrować (przynajmniej za pomocą metody).
albanx
9
Jeśli ważna jest wydajność, możesz użyć tej zoptymalizowanej wersji. Jest około 5 razy szybszy niż te z stringWithFormatlub NSMutableString.
Cóż, ponieważ ludzie pytali o wersję strumieniową plików. Zmodyfikowałem ładny mały fragment autorstwa Joela Lopesa Da Silvy, który działa z MD5, SHA1 i SHA512 ORAZ korzysta ze strumieni. Jest stworzony dla iOS, ale działa również z minimalnymi zmianami na OSX (usuń metodę ALAssetRepresentation). Może tworzyć sumy kontrolne dla plików, którym podano ścieżkę do pliku lub ALAssets (używając ALAssetRepresentation). Dzieli dane na małe pakiety, dzięki czemu wpływ na pamięć jest minimalny, niezależnie od rozmiaru pliku / rozmiaru zasobu.
Kod, który opublikował Joel, ma stan wyścigu i wygląda na to, że Twój może go odziedziczyć. Zobacz komentarz, który opublikowałem w poście Joela. joel.lopes-da-silva.com/2010/09/07/…
xyzzycoder
Dzięki! Poprawiłem to teraz. Nigdy nie stanowiło to dla mnie problemu, ponieważ w oryginalnej realizacji zawsze uruchamiałem ją w dedykowanym wątku;)
Link obejmuje Common Crypto, z którego korzysta większość odpowiedzi.
zaph
1
Jasne, algo jest takie samo. Pamiętaj jednak, że implementacja własnego algorytmu kryptograficznego może wprowadzić wady. Poprawność wszystkich scenariuszy wymaga dużo pracy . Dlatego w typowym przypadku preferowane jest używanie wersji bibliotecznej.
Odpowiedzi:
md5 jest dostępny na iPhone'a i można go dodać jako dodatek do ie
NSString
iNSData
jak poniżej.MyAdditions.h
MyAdditions.m
EDYTOWAĆ
Dodałem NSData md5, ponieważ sam go potrzebowałem i pomyślałem, że to dobre miejsce na zapisanie tego małego fragmentu ...
Metody te są weryfikowane przy użyciu wektorów testowych NIST MD5 w http://www.nsrl.nist.gov/testdata/
źródło
strlen
daje ostrzeżenie: „Niejawna konwersja traci precyzję liczby całkowitej: 'unsigned long' na 'CC_LONG' (aka 'unsigned int')”W tym celu możesz skorzystać z wbudowanej biblioteki Common Crypto. Pamiętaj, aby zaimportować:
i wtedy:
źródło
self
przed wykonaniem; jeśli self jest zerowe, to się rozbije.(int)
zanimstrlen
np.(int)strlen
...Jeśli ważna jest wydajność, możesz użyć tej zoptymalizowanej wersji. Jest około 5 razy szybszy niż te z
stringWithFormat
lubNSMutableString
.To jest kategoria NSString.
źródło
Cóż, ponieważ ludzie pytali o wersję strumieniową plików. Zmodyfikowałem ładny mały fragment autorstwa Joela Lopesa Da Silvy, który działa z MD5, SHA1 i SHA512 ORAZ korzysta ze strumieni. Jest stworzony dla iOS, ale działa również z minimalnymi zmianami na OSX (usuń metodę ALAssetRepresentation). Może tworzyć sumy kontrolne dla plików, którym podano ścieżkę do pliku lub ALAssets (używając ALAssetRepresentation). Dzieli dane na małe pakiety, dzięki czemu wpływ na pamięć jest minimalny, niezależnie od rozmiaru pliku / rozmiaru zasobu.
Obecnie znajduje się na github tutaj: https://github.com/leetal/FileHash
źródło
Każdy powód, aby nie korzystać z implementacji Apple: https://developer.apple.com/library/mac/documentation/Security/Conceptual/cryptoservices/GeneralPurposeCrypto/GeneralPurposeCrypto.html#//apple_ref/doc/uid/TP40011172-CH9-SW1
Wyszukaj Przewodnik po usługach kryptograficznych w witrynie programistów Apple.
źródło