我正在进行descrypt bruteforcer的概念验证,并且单线程版本在大约190k哈希/ s下运行良好,单核i-7 860 cpu。
我现在正在尝试制作这个程序的多线程版本(我第一次玩线程,所以我希望我在这里做错了。)
我首先尝试直接使用crypt,这很快但导致了错误的哈希值,因为线程正在对密码函数提出质疑。
在函数上使用互斥锁和解锁帮助,但这会将程序的速度降低到比单线程版本高几个百分点。
然后我设法谷歌了crypt_r,这被宣传为线程安全。 修改了单线程版本以使用crypt_r(使用单线程) 使用它而不是crypt的多线程版本,当使用两个核心,利用率达到99.9%时,单线程版本的性能下降到大约3.6k h / s,多线程版本大约为7.7k h / s。
所以问题是,这应该慢吗?
答案 0 :(得分:0)
问题是,我在执行crypt_r函数时调用的函数还包含初始化它所需的结构的代码。
解决方案是将初始化移出完成散列时调用的函数。
简化示例不正确方式:
for (int i = 0; i < 200000; i++)
{
struct crypt_data data;
data.initialized = 0;
char* hash = crypt_r("password", "sa", &data);
printf("%i %s", i, hash);
}
正确的方法:
struct crypt_data data;
data.initialized = 0;
for (int i = 0; i < 200000; i++)
{
char* hash = crypt_r("password", "sa", &data);
printf("%i %s", i, hash);
}