一连几天都没找出解决的方法,来这求助

abinsoft110 2019-01-16 04:44:32
问题是这样子的。

一个4位验证码破解

我开始的算法是
0----1999
2000-----2999
3000-----3999
4000-----4999
5000-----5999
6000-----6999
7000-----7999
8000-----8999
9000-----9999

9个线程来跑 然而很快就跑出来了

最后发现一但验证码出来后就不能在进行验证码请求了 不然就会被覆盖
比如 其中一个线程试出来验证码为2354 那么 所有的线程都不能在进行试了

现在没办法控制线程 所以 验证码出来后 无法来进行控制别的线程不让他试了 就有错误的验证码给覆盖了




...全文
602 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
FainSheeg 2019-01-28
  • 打赏
  • 举报
回复
还是把你的破解逻辑写上来吧,这样让人猜你是得不到答案的。
橘子皮... 2019-01-27
  • 打赏
  • 举报
回复
你说的应该是短信验证码,不是搞这个,不正规,会被认为是攻击
孤独的海啊 2019-01-27
  • 打赏
  • 举报
回复
看需求是你的验证码属于独占资源,有一个出来其它就要停下来,so ,觉得你不应该多线程跑这个代码。
张天星 2019-01-27
  • 打赏
  • 举报
回复
你要破解的验证码,是一动不动等你破解,输入成功就是成功。输入不成功可以任意尝试?
你用多线程,解决的最耗时间的是哪一步?是输入验证码,然后等待对方验证是否成功么?
如果是这样,破解验证这一步本身就应该是互不干扰的,一个破解成功就破解成功了,做你成功之后的事情,其他线程继续破解应该没有影响。
如果破解这一步是会互相干扰的,成功的会被失败的覆盖,那么多线程的意义就不存在了,因为这一步属于线程公共方法,必须加锁来避免覆盖,而最耗时间的就在这里(猜测),加锁就没有多线程的意义了
xuzuning 2019-01-25
  • 打赏
  • 举报
回复
引用 7 楼 abinsoft110 的回复:
[quote=引用 2 楼 娃都会打酱油了 的回复:] 加个全局变量,所有线程都会判断这个值不就行了
谢谢你的回复 这个办法是行不通的~ 比如说A 线程 进行了设置 但是B线程可能在你设置之间就进入了! A完成后 B也会执行的 [/quote]
引用 8 楼 abinsoft110 的回复:
[quote=引用 4 楼 caozhy 的回复:] 每个线程一个循环,每次循环判断一个 event 是否被设置,设置了,就终止循环
行不通的~ A 进行设置时 可能B已经进入了 你这设置是无效的[/quote] 既然是写多线程应用,那么怎么就不知道访问公共资源是需要加锁的呢? 仅凭自己的臆想,就否定别人合理的建议,这绝不是科学的治学态度
FainSheeg 2019-01-25
  • 打赏
  • 举报
回复
引用 14 楼 liusa1997 的回复:
引用 13 楼 FainSheeg 的回复:
[quote=引用 11 楼 liusa1997 的回复:]
这个就是多线程时当线程反复执行最后很可能产生垃圾数据,你需要做的是每个线程都要进行判断是否是破解的验证码,但是这样9个if程序是慢的,然后就是多线程运行时,那么这9个线程,只允许同一时间运行一个,其余的暂停,当1线程将1-1999运行完了自动释放空间让下一个线程进入运行
按这个思路,请问还要用多线程干什么?直接单线程得了

嗯,虽然是这个道理,但是多线程怎么整呢?每个线程运行完时间不确定,很容易把需求值覆盖掉,如果每个线程都判断运行速度回变慢,有什么方法吗?[/quote]不知道楼主的代码逻辑是什么样的。我理解的是多线程去验证是否正确,正确就抛出,如果按这个逻辑的话应该只有一个线程会抛出数据啊,不存在什么覆盖的。
liusa1997 2019-01-25
  • 打赏
  • 举报
回复
引用 13 楼 FainSheeg 的回复:
引用 11 楼 liusa1997 的回复:
这个就是多线程时当线程反复执行最后很可能产生垃圾数据,你需要做的是每个线程都要进行判断是否是破解的验证码,但是这样9个if程序是慢的,然后就是多线程运行时,那么这9个线程,只允许同一时间运行一个,其余的暂停,当1线程将1-1999运行完了自动释放空间让下一个线程进入运行
按这个思路,请问还要用多线程干什么?直接单线程得了

嗯,虽然是这个道理,但是多线程怎么整呢?每个线程运行完时间不确定,很容易把需求值覆盖掉,如果每个线程都判断运行速度回变慢,有什么方法吗?
FainSheeg 2019-01-25
  • 打赏
  • 举报
回复
引用 11 楼 liusa1997 的回复:
这个就是多线程时当线程反复执行最后很可能产生垃圾数据,你需要做的是每个线程都要进行判断是否是破解的验证码,但是这样9个if程序是慢的,然后就是多线程运行时,那么这9个线程,只允许同一时间运行一个,其余的暂停,当1线程将1-1999运行完了自动释放空间让下一个线程进入运行
按这个思路,请问还要用多线程干什么?直接单线程得了
xuzuning 2019-01-25
  • 打赏
  • 举报
回复
你这一万个数字中至多有一个符合条件,也就是至多加锁一次 何来的 效率要慢的多 一说?
abinsoft110 2019-01-25
  • 打赏
  • 举报
回复
引用 9 楼 abinsoft110 的回复:
[quote=引用 5 楼 wanghui0380 的回复:]
var b=Task.WaitAny(task1,task2)

var res=await b


这代码是等待第一个任务完成,至于后续任务虽然继续执行,但忽略返回

task1这个可以是

 task<int> mytask(list<int> list)
{
await Task.Yield();

var tcs = new TaskCompletionSource<bool>();

Task.Run(() =>
{
foreach(var item in list)
{
if(check(item)) //check方法就是你去检查的代码,这个你直接完成
{
tcs.SetResult(item); //检查成功异步返回
}
}
});

tcs.Task.Wait(); //同步等待完成 ,这里其实也可以直接返回tcs.task
}


当然这只是其中一种简便的完成方式。其实也还有利用 CancelTokenSource 的控制,任何一个优先完成后,直接把CancelTokenSource Cancel掉就行。或者采用信号量控制也是ok的




谢谢回复 线程同步我试了也不行! 速度太慢了[/quote]

谢谢回复 我现在试着用task同步看看能不能解决~
abinsoft110 2019-01-25
  • 打赏
  • 举报
回复
引用 16 楼 xuzuning 的回复:
[quote=引用 7 楼 abinsoft110 的回复:]
[quote=引用 2 楼 娃都会打酱油了 的回复:]
加个全局变量,所有线程都会判断这个值不就行了


谢谢你的回复
这个办法是行不通的~

比如说A 线程 进行了设置 但是B线程可能在你设置之间就进入了! A完成后 B也会执行的 [/quote]

引用 8 楼 abinsoft110 的回复:
[quote=引用 4 楼 caozhy 的回复:]
每个线程一个循环,每次循环判断一个 event 是否被设置,设置了,就终止循环


行不通的~ A 进行设置时 可能B已经进入了 你这设置是无效的[/quote]

既然是写多线程应用,那么怎么就不知道访问公共资源是需要加锁的呢?
仅凭自己的臆想,就否定别人合理的建议,这绝不是科学的治学态度[/quote]



谢谢你的回复 加锁的话效率要慢的多! 每生成一个码要请求一下进行验证 这样解出的机率很小了。
liusa1997 2019-01-24
  • 打赏
  • 举报
回复
例子也有:当我开10000个线程时,反复对一个数据(10000)进行+和-,一共5000次+,5000次-,那么结果很可能不是10000
http://how2j.cn/k/thread/thread-methods/354.html,你可以参考这里第八题破解简单密码练习(穷举)。
http://how2j.cn/k/thread/thread-synchronized/355.html#nowhere,在这里你可以更清楚了解多线程
liusa1997 2019-01-24
  • 打赏
  • 举报
回复
这个就是多线程时当线程反复执行最后很可能产生垃圾数据,你需要做的是每个线程都要进行判断是否是破解的验证码,但是这样9个if程序是慢的,然后就是多线程运行时,那么这9个线程,只允许同一时间运行一个,其余的暂停,当1线程将1-1999运行完了自动释放空间让下一个线程进入运行
SDHU 2019-01-24
  • 打赏
  • 举报
回复
只要验证码是对的,就把验证码抛出去,就不关这几个线程的事情了
abinsoft110 2019-01-23
  • 打赏
  • 举报
回复
引用 5 楼 wanghui0380 的回复:
var b=Task.WaitAny(task1,task2)

var res=await b


这代码是等待第一个任务完成,至于后续任务虽然继续执行,但忽略返回

task1这个可以是

 task<int> mytask(list<int> list)
{
await Task.Yield();

var tcs = new TaskCompletionSource<bool>();

Task.Run(() =>
{
foreach(var item in list)
{
if(check(item)) //check方法就是你去检查的代码,这个你直接完成
{
tcs.SetResult(item); //检查成功异步返回
}
}
});

tcs.Task.Wait(); //同步等待完成 ,这里其实也可以直接返回tcs.task
}


当然这只是其中一种简便的完成方式。其实也还有利用 CancelTokenSource 的控制,任何一个优先完成后,直接把CancelTokenSource Cancel掉就行。或者采用信号量控制也是ok的




谢谢回复 线程同步我试了也不行! 速度太慢了
abinsoft110 2019-01-23
  • 打赏
  • 举报
回复
引用 4 楼 caozhy 的回复:
每个线程一个循环,每次循环判断一个 event 是否被设置,设置了,就终止循环


行不通的~ A 进行设置时 可能B已经进入了 你这设置是无效的
abinsoft110 2019-01-23
  • 打赏
  • 举报
回复
引用 2 楼 娃都会打酱油了 的回复:
加个全局变量,所有线程都会判断这个值不就行了


谢谢你的回复
这个办法是行不通的~

比如说A 线程 进行了设置 但是B线程可能在你设置之间就进入了! A完成后 B也会执行的
threenewbee 2019-01-17
  • 打赏
  • 举报
回复
每个线程一个循环,每次循环判断一个 event 是否被设置,设置了,就终止循环
wanghui0380 2019-01-17
  • 打赏
  • 举报
回复
TaskCompletionSource 本身其实也是异步信号量手段
wanghui0380 2019-01-17
  • 打赏
  • 举报
回复
var b=Task.WaitAny(task1,task2)

var res=await b


这代码是等待第一个任务完成,至于后续任务虽然继续执行,但忽略返回

task1这个可以是

 task<int> mytask(list<int> list)
{
await Task.Yield();

var tcs = new TaskCompletionSource<bool>();

Task.Run(() =>
{
foreach(var item in list)
{
if(check(item)) //check方法就是你去检查的代码,这个你直接完成
{
tcs.SetResult(item); //检查成功异步返回
}
}
});

tcs.Task.Wait(); //同步等待完成 ,这里其实也可以直接返回tcs.task
}


当然这只是其中一种简便的完成方式。其实也还有利用 CancelTokenSource 的控制,任何一个优先完成后,直接把CancelTokenSource Cancel掉就行。或者采用信号量控制也是ok的
加载更多回复(3)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧