【发布时间】:2019-02-21 07:12:20
【问题描述】:
背景
我们需要将 Javascript 哈希算法转换为 Perl 代码。因此,我们需要将 Javascript 的移位运算符 > 和 >>> 转换为 Perl。到目前为止,我们已经有了进行转换的算法,但是由于 Javascript 的按位移位运算符对 32 位整数进行操作,因此我们还需要在 Perl 中进行模拟。
Python 解决方案
根据这篇文章https://stackoverflow.com/a/41610348,我们了解到我们可以在 Python 中使用 ctypes 来做到这一点。例如,将整数左移 x 位:
import ctypes
print (ctypes.c_int(integer << x ^ 0).value)
Perl 问题
我的理解是,我们需要使用 XS 来做到这一点。我的问题是是否有人有一个快速的解决方案来实施它。我们不知道 XS。我们可以开始学习它,但从我的印象来看,学习曲线非常高,可能需要一段时间才能掌握它。当然,如果存在非 XS 解决方案,那将是理想的。任何解决方案或提示将不胜感激。
解决方法
由于我们已经有了 Python 解决方案,我们可以在 Python 中实现这个模块,然后从 Perl 中调用它。性能并不是真正的问题,因此这种“hack”是可以接受的,尽管有些不可取。换句话说,我们更愿意只在 Perl 中维护整个程序(由几个模块组成)。
【问题讨论】:
-
将结果截断为 32 位还不够吗?如
use constant { I32 => 0xffff_ffff }; ... ($x << $n) & I32? -
你能给我们看看 JavaScript 哈希码吗?
-
@melpomene 感谢您的建议,但这不起作用。我们已经尝试了一些类似的实现。较大的整数在移位后可能会溢出 32 位边界,因此简单地截断结果并不总是给出正确的答案。在 SO 上的 Python 解决方案中已经给出了其他几个类似的解决方案,但从测试来看,唯一每次都有效的解决方案是使用 ctypes.c_int
-
你的团队中有人写 C 吗?然后你可以使用metacpan.org/pod/C::Blocks 或metacpan.org/pod/distribution/Inline-C/lib/Inline/C.pod
-
@DiabJerius
Inline::C看起来会起作用。它还附带一本食谱:https://metacpan.org/pod/distribution/Inline-C/lib/Inline/C/Cookbook.pod 感谢您的建议。我稍后会试一试。
标签: javascript python perl bitwise-operators