Python中文
首页
教程
问答
标签
搜索
登录
注册
Python:“Unmask”一个d的长XOR'd字符串
回答此问题可获得
20
贡献值,回答如果被采纳可获得
50
分。
<p>作为<a href="https://tools.ietf.org/html/rfc6455" rel="nofollow">WebSocket spec</a>的一部分,所有客户端发送的帧<strong>必须</strong>使用4字节掩码屏蔽帧的有效负载部分。在C++中,这将是非常容易的:</p> <pre><code>for (size_t i = 0; i < length; i++) { data[i] ^= mask[i % 4]; } </code></pre> <p>遗憾的是,Python字符串是不可变的,我宁愿避免这样做,因为字符串缓冲区的不断复制和重新创建:</p> ^{pr2}$ <p>经过一番研究,我发现了一个:</p> <pre><code>m = itertools.cycle(mask) frame = ''.join(chr(ord(x) ^ ord(y)) for (x,y) in itertools.izip(oldFrame, m)) </code></pre> <p>在CPython中,这将解密所需的时间减少了一半。在PyPy中,对于一个16MB掩码字符串,这很容易增长到1.5GB的RAM使用量,之后它开始交换,我不得不终止它。CPython只为16MB字符串使用150mbram(需要20秒),但这仍然很糟糕。相比之下,我的C++基准测试在0.05秒内完成,没有内存开销。在</p> <p>当然,一旦软件进入生产模式,这些极端情况就不会发生(所有传入数据的上限为10KB),但我真的希望在这个基准测试中有一个好的分数。在</p> <p>有什么想法吗?唯一的要求是:CPython和PyPy都很快,并且内存使用率很低。不必保留原始字符串。在</p> <p>一些测试代码适用于那些想做实验的人:</p> <pre><code>import os, time frame = os.urandom(16 << 20) mask = os.urandom(4) def unmask(oldFrame, mask): # Do your magic return newFrame for i in range(0, 3): # Run several times, to help PyPy's JIT compiler startTime = time.time() f = unmask(frame, mask) endTime = time.time() print 'This run took %.3f seconds' % (endTime - startTime) </code></pre>
0 条评论
分类:
Python问答
请先
登录
后评论
默认排序
时间排序
1 个回答
匿名
1天前
擅长:python、mysql、java
<p>改用<a href="http://docs.python.org/2/library/functions.html#bytearray" rel="nofollow">bytearray</a>,它是可变的。在</p> <pre><code>frame = bytearray(frame) for i in range(len(mask)): frame[i] ^= mask[i] </code></pre>
请先
登录
后评论
针对此问题:
更多的回答
关注
89
关注
收藏
1
收藏,
216
浏览
网友 提问于 2天前
相关Python问题
如何添加虚拟方法
5 回答
如何添加表示整数的擦边字符串?
5 回答
如何添加要在Bokeh中使用的新font.ttf文件?
2 回答
如何添加要显示的矩阵XY轴编号和XY轴
10 回答
如何添加计数?
10 回答
如何添加计数器函数?
2 回答
如何添加计数器列来计算数据帧中另一列中的特定值?
5 回答
如何添加计数器来跟踪while循环中的月份和年份?
8 回答
如何添加计数并删除countplot的顶部和右侧脊椎?
7 回答
如何添加计时器wx.应用程序更新窗口对象的主循环?
2 回答
如何添加评论到帖子?PostDetailVew,Django 2.1.5
4 回答
如何添加评论拉梅尔亚姆
8 回答
如何添加诸如矩阵Python/Pandas之类的数据帧?
3 回答
如何添加谷歌地点自动完成到Flask?
1 回答
如何添加超时、python discord bot
1 回答
如何添加超过1dp的检查
8 回答
如何添加距离方法
5 回答
如何添加跟随游戏的敌人精灵
1 回答
如何添加路径以便python可以找到程序?
10 回答
如何添加身份验证/安全性以使用happybase访问HBase?
10 回答