Tôi đã viết thử nghiệm này trong C bằng cách sử dụng triển khai OpenSSL SHA256.
#include <stdio.h>
#include <string.h>
#include "openssl/sha.h"
// http://stackoverflow.com/questions/4764608/generate-all-strings-under-length-n-in-c/4764686#4764686
int inc(char *str) {
if (!str[0]) return 0;
if (str[0] == 'z') {
str[0] = 'a';
return inc(str + sizeof(char));
}
str[0]++;
return 1;
}
unsigned char buffer[65];
char* hashstring(char *str, int len) {
char hash[SHA256_DIGEST_LENGTH]; // the openssl hash
SHA256_CTX sha256;
int i; // counter
SHA256_Init(&sha256);
SHA256_Update(&sha256, str, len);
SHA256_Final(hash, &sha256);
for (i = 0; i < SHA256_DIGEST_LENGTH; i++) {
sprintf(buffer + (i * 2), "%02x", hash[i]); // convert openssl hash to mortal human string
}
return buffer;
}
int main(int argc, char *argv[]) {
int N = 4; // max length string
char str[N+1]; // the string holder
int i; // counter
unsigned int tot = 0; // number of hashes calculated
for (i = 0; i < N; i++) str[i] = 'a';
str[N] = 0;
do {
hashstring(str, N);
tot++;
} while(inc(str));
printf("%d\n", tot);
}
Compile:
gcc -lcrypto -O3 -o test test.c
Và kết quả (Tôi biết, tôi không phải là rất sáng tạo với computernames):
[email protected]:~/c/sha256$ time ./test
11881376
real 3m2.431s
user 3m2.335s
sys 0m0.008s
Vì vậy, đó là 11881376/182.4 = 65139
băm mỗi giây. Sau đó, nó là 26^7/101821/3600 = 34
giờ để tính toán tất cả các băm. Xin lưu ý, tất cả điều này đã được thực hiện trên một CPU quad-core Q6600 trong một ứng dụng đơn luồng và loại trừ việc viết các băm để tập tin.
EDIT
Woops, tôi đã tính toán tất cả các giá trị băm của chuỗi với N ký tự và dưới. Đã sửa và cập nhật dữ liệu.
để - quay lên 4 chương trình của bạn và bạn có thể tạo khoảng 400k băm/giây. – nos
Tôi đã tạo ra các chuỗi sai, nhưng bây giờ nó là OK. Tôi cũng đã may mắn trên một lần chạy (lưu ý, đây là một PC, rất nhiều thứ khác cũng chạy). – orlp
Cảm ơn, tôi tình cờ có Q8200 vì vậy điều này là rất áp dụng cho bản thân mình. Tôi tự hỏi làm thế nào nhanh chóng một CPU Sandy Bridge mới có thể di chuyển. – Xeoncross