V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zhaomanong
V2EX  ›  外包

招兼职程序员 语言不限

  •  1
     
  •   zhaomanong · 2016-09-29 15:58:10 +08:00 · 1991 次点击
    这是一个创建于 2765 天前的主题,其中的信息可能已经有所发展或是发生改变。

    时间充裕,基础好,收入让人非常一颗赛艇。请解决下面问题联系我们:

    We hope you can contact our wechat ID hashed below:

    1cb251ec0d568de6a929b520c4aed8d11cb251ec0d568de6a929b520c4aed8d11cb251ec0d568de6a929b520c4aed8d11cb251ec0d568de6a929b520c4aed8d11cb251ec0d568de6a929b520c4aed8d11cb251ec0d568de6a929b520c4aed8d11cb251ec0d568de6a929b520c4aed8d11cb251ec0d568de6a929b520c4aed8d1

    First, we generated a series of string prefixes with lengths increasing by 1. For example, if our wechat ID was helloworld, we would generate: he hell hellow hellowor ... helloworld

    Then, for every prefix s, we computed the following hash J: md5(md5(e) + s + md5(s)) [where + is the string concatenation operator and e is 'v2ex']. Finally, we concatenated all hash strings J to form the long hash above!

    For example, for helloworld, we would compute: md5(md5('v2ex') + 'h' + md5('h')) + md5(md5('v2ex') + 'he' + md5('he')) + md5(md5('v2ex') + 'hel' + md5('hel')) + ...

    For the sake of simplicity, you can assume that our wechat ID only contains alphanumeric characters.

    After solving the challenge, please contact the wechat ID that you decoded and send us your resume. You can also access our website by www.wechatID.com know what we do.

    Good Luck!

    第 1 条附言  ·  2016-09-29 22:23:40 +08:00
    o(╯□╰)o 囧囧囧

    发现生成 hash 的程序写错了。。对一个固定字符串进行 hash 了。 Sorry!

    应该是

    3bed22f7f496e84b035a996522baa7594c27c7e5718a78bfddf9012904b70eb755d67f90c8de149ead7ee674b024f38c216642030c2d54cb1dd657dd66342c99c239f3c31fd399fc052a9b7861f2073d2b9f47811dd77fd544d570c34bf5f349d110389979571714694a5054238465ca38ba26c25fb1a32b4d0a3b93666b09b3
    第 2 条附言  ·  2016-09-30 22:08:12 +08:00
    这一期招满啦,非常感谢大家的参与。真是各路语言齐飞啊 哈哈哈。

    还会有下一期,下次争取想个更好玩的题。
    40 条回复    2016-10-13 17:15:31 +08:00
    mokaiZz
        1
    mokaiZz  
       2016-09-29 19:40:37 +08:00 via iPhone
    so cool~
    a812159920
        2
    a812159920  
       2016-09-29 20:17:46 +08:00
    怎么是一个广告网站?
    lygmqkl
        3
    lygmqkl  
       2016-09-29 20:24:49 +08:00
    有点意思,但是 第 19w 的账号。。。
    lygmqkl
        4
    lygmqkl  
       2016-09-29 21:03:02 +08:00
    我预言下,这个招聘最后没人会去解。

    理由如下:
    1. 信息不对等,甚至有点不放心。对所谓的招聘几乎一无所知,只说了收入好,保不齐是小 P 孩想出来的点子。我就不相信一个做 Web 的解出这道题就能去写桌面程序了?

    2. 看似专业的招聘其实内容有逻辑漏洞,感觉在显摆。特别是最后一句话, wechat ID, 除了账号和数字,还能有第三种组成?中文,特殊字符?与其说这个不如说下总长度,或许那才是 sake of simplicity

    最后说下解法,这个纯粹是为了防止被喷,提一下思路:

    首先长度,我估计在 6-10 位,如果是手机号有可能是 11 位,可以优先尝试纯数字,因为 wechat 后期的策略是手机号注册。

    接着说解法,就是拿一定规则生成的字符串,通过提示的 hash logic 生成,然后和 1cb251ec0d568de6a929b520c4aed8d1 做对比

    接着说字符串生成规则,既然是只有字母和数字,考虑 ascii 码通过数字在一定范围内变幻的方式来穷举吧

    最后说点我喜欢的可以上升到架构层面来玩一下,其实是最终用时
    第一步,可以开一台 vps ,新建一个数据库,然后用 php cli 模式不停的往数据库里去写入穷举字符串,可以多跑几个 cli 用长度区分 比如 A(1-5bit 数量很少还是 cover 一下)B(6bit)C(7Bit)D(8Bit).
    第二部,再写个简单的 php cli 多线程代码,包含数据库读取|拆分|加密过程,结果不用存回了,比较下不合适就丢弃吧(已读数据 flag)。这个 php cli 代码可以部署到 20 台(更多)aliyun vps 上形成一个小型分布式系统对数据库里不停出现的字符串进行比对,命中后给自己发个邮件吧。

    时间嘛 估计 4-5 个小时 应该差不多就能出结果了。可是值得吗?
    garyglgan
        5
    garyglgan  
       2016-09-29 22:10:26 +08:00   ❤️ 1
    骗眼球的,这个串实际上由 8 个完全一样的 md5 digest 组成,每个都是一个 MD5('text'),所以上面的串实际上是 MD5('text')+MD5('text')+MD5('text')+MD5('text')+MD5('text')+MD5('text')+MD5('text')+MD5('text')
    zhaomanong
        6
    zhaomanong  
    OP
       2016-09-29 22:15:48 +08:00
    @lygmqkl
    1. 没有招聘信息是因为是灰色产业,不想引来太多的关注。但保证不违法,收入非常可观。
    2. 之所以是 wechat ID 也是有一定原因的,解开之后自会明白。

    感谢您的思路!但是真新没这么复杂啦, vps 都祭出来了,哈哈

    Hint : 通过 hash 的长度,可以确定知道此微信 id 长度。
    zhaomanong
        7
    zhaomanong  
    OP
       2016-09-29 22:25:42 +08:00
    @garyglgan 感谢指出错误....
    templefox
        8
    templefox  
       2016-09-29 23:30:13 +08:00
    附言的连位数都不对,没有一点点诚意
    templefox
        9
    templefox  
       2016-09-29 23:31:09 +08:00
    @templefox 是我看错了
    goodman001
        10
    goodman001  
       2016-09-30 01:02:37 +08:00 via iPhone
    临睡前才看到,已有思路, wait for me !
    goodman001
        11
    goodman001  
       2016-09-30 01:05:06 +08:00 via iPhone
    @lygmqkl 没有辣么复杂~
    TotoroLee
        12
    TotoroLee  
       2016-09-30 01:58:03 +08:00
    golang 写完,运行不到 1 秒就能出结果~
    kernel365
        13
    kernel365  
       2016-09-30 07:51:51 +08:00 via iPhone
    一颗赛艇
    lygmqkl
        14
    lygmqkl  
       2016-09-30 08:29:13 +08:00
    @goodman001 之前的 hash 是重复的,以为是随机 string 生成的 32 位 hash ,现在的 hash 倒简单了。
    lygmqkl
        15
    lygmqkl  
       2016-09-30 08:29:40 +08:00
    @garyglgan 昨天睡觉前我也发现了是 text 加密。
    newguest
        16
    newguest  
       2016-09-30 08:30:13 +08:00 via Android
    Mark
    goodman001
        17
    goodman001  
       2016-09-30 09:39:47 +08:00
    goodman001
        18
    goodman001  
       2016-09-30 09:39:47 +08:00
    goodman001
        19
    goodman001  
       2016-09-30 09:40:14 +08:00
    @lygmqkl 嘿嘿
    goodman001
        20
    goodman001  
       2016-09-30 09:40:39 +08:00
    python 秒破
    garyglgan
        21
    garyglgan  
       2016-09-30 10:08:39 +08:00
    @zhaomanong
    wechat ID 该用户不存在
    ytmsdy
        22
    ytmsdy  
       2016-09-30 10:16:01 +08:00
    卧槽!!!!!
    cocalrush
        23
    cocalrush  
       2016-09-30 10:52:32 +08:00
    囧 没那么复杂 刚开始想到,直接用最后一个算我也是醉了...
    Nexvar
        24
    Nexvar  
       2016-09-30 13:33:11 +08:00 via Android
    楼主在美国,破译了找他不在,估计现在睡觉中
    kcross
        25
    kcross  
       2016-09-30 15:48:48 +08:00
    灰色产业 是去菲律宾开发扑克游戏吗?
    huai
        26
    huai  
       2016-09-30 16:19:51 +08:00
    js 可破
    jiangzhuo
        27
    jiangzhuo  
       2016-09-30 16:50:07 +08:00
    解开了,原来还有这样的细分领域,似乎你们不需要 node.js 的
    ezreal
        28
    ezreal  
       2016-09-30 21:43:03 +08:00
    好叼了这行业
    hanswe
        29
    hanswe  
       2016-09-30 23:05:40 +08:00
    var charSets = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd',
    'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
    'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
    'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '_', '-'];

    试了下穷举, 8^64 次方,用 node 大概 4s 算了 1w 个,一辈子也算不出来了吧。。。

    楼上算出来的各位是怎么解的?
    hanswe
        30
    hanswe  
       2016-09-30 23:15:18 +08:00
    明白怎么算了。。。我想错了
    hanswe
        31
    hanswe  
       2016-09-30 23:22:27 +08:00
    服了。。。算出来是个干这的。。。
    syv2
        32
    syv2  
       2016-09-30 23:31:33 +08:00
    这题没什么难度吧,挨个迭代就是了,楼上有人说秒破的,我这计算花了 0.036s ,写得太糙了

    加了微信,瞄了眼朋友圈,其实没灰色那么玄乎,小屁孩的作业水平
    kiddz
        33
    kiddz  
       2016-10-01 00:05:30 +08:00 via iPhone
    easy one
    kiddz
        34
    kiddz  
       2016-10-01 00:06:09 +08:00 via iPhone
    的确不怎么灰
    kcross
        35
    kcross  
       2016-10-01 01:24:38 +08:00
    这种事情还不灰难道还是白的?
    Nexvar
        36
    Nexvar  
       2016-10-01 15:39:23 +08:00
    laoyur
        37
    laoyur  
       2016-10-01 17:19:45 +08:00
    好吧,我也来贴一个, Python 初学者,轻喷……
    https://gist.github.com/laoyur/08cf96cad3c76815224cfc203fd43bb3
    POP
        38
    POP  
       2016-10-03 19:32:40 +08:00
    csdaixie
    msg7086
        39
    msg7086  
       2016-10-03 23:06:01 +08:00
    require 'digest'

    md5 = '3bed22f7f496e84b035a996522baa7594c27c7e5718a78bfddf9012904b70eb755d67f90c8de149ead7ee674b024f38c216642030c2d54cb1dd657dd66342c99c239f3c31fd399fc052a9b7861f2073d2b9f47811dd77fd544d570c34bf5f349d110389979571714694a5054238465ca38ba26c25fb1a32b4d0a3b93666b09b3'
    prefix = Digest::MD5.hexdigest 'v2ex'
    str = ''

    md5.scan(/.{32}/) { |m| str += [*'0'..'9',*'A'..'Z',*'a'..'z'].find { |s| Digest::MD5.hexdigest(prefix + str + s + Digest::MD5.hexdigest(str + s)) == m } }

    puts str #=> csdaixie

    撸逼版。
    knh190
        40
    knh190  
       2016-10-05 13:20:20 +08:00
    (defun solve (str)
    (let ((ans ""))
    (do ((i 0 (+ i 32)))
    ((>= i (length str)) 'done)
    (let ((s (subseq str i (+ i 32))))
    (setf ans (solve-rec s ans))))
    ans))

    (defun solve-rec (s ans)
    (loop for a in (append *lower* *upper*) do
    (let ((next (concatenate 'string ans a)))
    (if (equal (hash next) s)
    (return next)))))

    Lisp 版: https://gist.github.com/KHN190/b85a1258b3bcdb5f01a4649074d5e38c
    fwy1998
        41
    fwy1998  
       2016-10-13 17:15:31 +08:00
    于是...你又水了一贴?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3425 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 00:07 · PVG 08:07 · LAX 17:07 · JFK 20:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.