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

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 那么 所有的线程都不能在进行试了

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




...全文
608 23 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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)

111,098

社区成员

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

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

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