使用许多 md5 实现中的任何一种在 C(或 Perl 或 Python)中执行此操作并不困难 - md5 的核心是一个从字符向量到字符向量的哈希函数。
因此,只需编写一个外部程序来读取 300 万个字符串,然后将它们一一输入到您选择的 md5 实现中。这样您就可以启动一个程序而不是 300 万个,仅此一点就可以节省您的时间。
FWIW 在一个项目中,我使用了 Christophe Devine 的 md5 实现(用 C 语言),还有 OpenSSL,我确信 CPAN 也会有一些用于 Perl 的 md5 实现。
Edit:好吧,没忍住。我提到的 md5 实现是例如里面这个小压缩包 http://dirk.eddelbuettel.com/code/digest/digest-current.tar.gz。拿走文件md5.c
并替换(#ifdef'ed out)main()
在底部这个
int main( int argc, char *argv[] ) {
FILE *f;
int j;
md5_context ctx;
unsigned char buf[1000];
unsigned char md5sum[16];
if( ! ( f = fopen( argv[1], "rb" ) ) ) {
perror( "fopen" );
return( 1 );
}
while( fscanf(f, "%s", buf) == 1 ) {
md5_starts( &ctx );
md5_update( &ctx, buf, (uint32) strlen((char*)buf) );
md5_finish( &ctx, md5sum );
for( j = 0; j < 16; j++ ) {
printf( "%02x", md5sum[j] );
}
printf( " <- %s\n", buf );
}
return( 0 );
}
构建一个简单的独立程序,例如在
/tmp$ gcc -Wall -O3 -o simple_md5 simple_md5.c
然后你会得到这个:
# first, generate 300,000 numbers in a file (using 'little r', an R variant)
/tmp$ r -e'for (i in 1:300000) cat(i,"\n")' > foo.txt
# illustrate the output
/tmp$ ./simple_md5 foo.txt | head
c4ca4238a0b923820dcc509a6f75849b <- 1
c81e728d9d4c2f636f067f89cc14862c <- 2
eccbc87e4b5ce2fe28308fd9f2a7baf3 <- 3
a87ff679a2f3e71d9181a67b7542122c <- 4
e4da3b7fbbce2345d7772b0674a318d5 <- 5
1679091c5a880faf6fb5e6087eb1b2dc <- 6
8f14e45fceea167a5a36dedd4bea2543 <- 7
c9f0f895fb98ab9159f51fd0297e236d <- 8
45c48cce2e2d7fbdea1afc51c7c6ad26 <- 9
d3d9446802a44259755d38e6d163e820 <- 10
# let the program rip over it, suppressing stdout
/tmp$ time (./simple_md5 foo.txt > /dev/null)
real 0m1.023s
user 0m1.008s
sys 0m0.012s
/tmp$
对于 300,000 个(短)字符串来说,这大约是一秒。