快速md5sum在bash / ubuntu上的数百万字符串
发布时间:2020-12-15 22:27:19 所属栏目:安全 来源:网络整理
导读:我需要在ubuntu上的bash脚本中使用300万个字符串的MD5总和. 300万字符串 – 300万个MD5哈希值.每个字符串实现大约需要0.005秒.那是4个多小时.有哪些更快的替代品?有没有办法将字符串组泵入md5sum? #time md5sum running 100 times on short strings#each i
我需要在ubuntu上的bash脚本中使用300万个字符串的MD5总和. 300万字符串 – > 300万个MD5哈希值.每个字符串实现大约需要0.005秒.那是4个多小时.有哪些更快的替代品?有没有办法将字符串组泵入md5sum?
#time md5sum running 100 times on short strings #each iteration is ~0.494s/100 = 0.005s time (for i in {0..99}; do md5sum <(echo $i); done) > /dev/null real 0m0.494s user 0m0.120s sys 0m0.356s 一个好的解决方案将包括一个bash / Perl脚本,它从stdin中获取一个字符串列表并输出一个MD5哈希值列表. 解决方法
使用许多md5实现中的任何一个在C(或Perl或Python)中做起来并不难 – 其核心md5是一个从字符向量到字符向量的散列函数.
因此,只需编写一个读取300万字符串的外部程序,然后逐个将它们提供给您选择的md5实现.这样你有一个程序启动而不是300万,只有这样才能节省你的时间. FWIW在一个项目中我使用了Christophe Devine的md5实现(在C中),还有OpenSSL,我相信CPAN也会为Perl提供一些它们. 编辑:好的,无法抗拒.我提到的md5实现是例如在这个small tarball里面.取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( " <- %sn",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(短)字符串来说大概是一秒钟. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |