üst cevabın doğru olduğunu, ancak bir şey söz etmedi: karma değeri her tampon için farklı olacaktır boyut kullanılır. Değer, kareler boyunca tutarlı olacaktır, bu nedenle aynı arabellek boyutu her seferinde aynı karmayı üretecektir, ancak bu karışma daha sonra aynı verinin bir karması ile karşılaştırılacaksa, her aramayla aynı tampon boyutu kullanılmalıdır. Eğer sizin doğru kod fonksiyonları sindirmek emin olun ve çevrimiçi karma web siteleri ile karma karşılaştırmak için çevrimiçi gitmek isterseniz ek olarak
, onlar Bu da ilginç bir düşünce getiriyor 1 bir tampon uzunluğu kullanmak görünür: Bu büyük bir dosya hash için 1 bir tampon uzunluğu kullanmak için mükemmel kabul edilebilir, sadece daha uzun sürecek (duh).
Başparmak kuralı yalnızca dahili kullanım için ise, daha sonra büyük bir dosya için arabellek uzunluğunu ayarlayabilirim, ancak diğer sistemlerle iyi oynamak zorundaysa, arabellek uzunluğunu 1 olarak ayarlayın ve anlaşma yapın. zaman sonucu ile.
int hashTargetFile(FILE* fp, unsigned char** md_value, int *md_len) {
#define FILE_BUFFER_LENGTH 1
EVP_MD_CTX *mdctx;
const EVP_MD *md;
int diglen; //digest length
int arrlen = sizeof(char)*EVP_MAX_MD_SIZE + 1;
int arrlen2 = sizeof(char)*FILE_BUFFER_LENGTH + 1;
unsigned char *digest_value = (char*)malloc(arrlen);
char *data = (char*)malloc(arrlen2);
size_t bytes; //# of bytes read from file
mdctx = EVP_MD_CTX_new();
md = EVP_sha512();
if (!mdctx) {
fprintf(stderr, "Error while creating digest context.\n");
return 0;
}
if (!EVP_DigestInit_ex(mdctx, md, NULL)) {
fprintf(stderr, "Error while initializing digest context.\n");
return 0;
}
while (bytes = fread(data, 1, FILE_BUFFER_LENGTH, fp) != 0) {
if (!EVP_DigestUpdate(mdctx, data, bytes)) {
fprintf(stderr, "Error while digesting file.\n");
return 0;
}
}
if (!EVP_DigestFinal_ex(mdctx, digest_value, &diglen)) {
fprintf(stderr, "Error while finalizing digest.\n");
return 0;
}
*md_value = digest_value;
*md_len = diglen;
EVP_MD_CTX_free(mdctx);
return 1;
}
Bunun gerekliliğini merak ediyorum. Eğer iplik güvenli değilse kötü bir fikir olabilir, çünkü programı uzun bir süre boyunca engelleyebilir ve P.O. – crockpotveggies
Bir dosyanın şifrelenmesi, MD5 gibi bir karma işleviyle aynı şekilde ele alınmaz. Gerçekten hash mı demek istiyorsunuz yoksa dosyayı şifrelemek mi istiyorsunuz? – Oleksi
MD5, akışa dayalıdır. 4GB’nın tamamını bir kerede belleğe yüklemeniz gerekmez - parçaları yığınlarda okursunuz. –