- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要将哈希函数从 JavaScript 转换为 Python。
函数如下:
function getIndex(string) {
var length = 27;
string = string.toLowerCase();
var hash = 0;
for (var i = 0; i < string.length; i++) {
hash = string.charCodeAt(i) + (hash << 6) + (hash << 16) - hash;
}
var index = Math.abs(hash % length);
return index;
}
console.log(getIndex(window.prompt("Enter a string to hash")));
此函数是 Objectively Correct™。它本身就是完美的。我无法改变它,我只能重新创建它。无论它输出什么,我的 Python 脚本也必须输出。
但是 - 我有几个问题,我认为这与这两种语言处理有符号整数的方式有关。
JS 按位运算符将其操作数视为 32 位序列。然而,Python 没有位限制的概念,并且像一个绝对的疯子一样继续运行。我认为这是两种语言之间的一个重要区别。
我可以通过使用 hash & 0xFFFFFFFF
将其屏蔽为 32 位来限制 Python 中 hash
的长度。
如果 hash
高于 0x7FFFFFFF
,我也可以用 hash = hash ^ 0xFFFFFFFF
(或 hash = ~hash
- 他们似乎都做同样的事情)。我相信这会模拟负数。
我使用一个名为 t
的函数将这两个限制应用于哈希。
到目前为止,这是我的 Python 代码:
def nickColor(string):
length = 27
def t(x):
x = x & 0xFFFFFFFF
if x > 0x7FFFFFFF:
x = x ^ 0xFFFFFFFF
return x
string = string.lower()
hash = t(0)
for letter in string:
hash = t(hash)
hash = t(t(ord(letter)) + t(hash << 6) + t(hash << 16) - t(hash))
index = hash % length
return index
它似乎一直工作到散列需要变为负值为止,此时两个脚本出现分歧。这通常发生在字符串中大约 4 个字母处。
我假设我的问题在于在 Python 中重新创建 JS 负数。我该如何告别这个问题?
最佳答案
这是一个有效的翻译:
def nickColor(string):
length = 27
def t(x):
x &= 0xFFFF_FFFF
if x > 0x7FFF_FFFF:
x -= 0x1_0000_0000
return float(x)
bytes = string.lower().encode('utf-16-le')
hash = 0.0
for i in range(0, len(bytes), 2):
char_code = bytes[i] + 256*bytes[i+1]
hash = char_code + t(int(hash) << 6) + t(int(hash) << 16) - hash
return int(hash % length if hash >= 0 else abs(hash % length - length))
重点是,只有移位 ( <<
) 被计算为 32 位整数运算,它们的结果是 converted back to double在输入加法和减法之前。我不熟悉这两种语言的 double 浮点表示规则,但可以安全地假设在所有个人计算设备和 Web 服务器上,这两种语言都是相同的,即 double-precision IEEE 754 .对于非常长的字符串(数千个字符),散列可能会丢失一些精度,这当然会影响最终结果,但在 JS 和 Python 中的方式相同(不是 Objectively Correct™ 函数的作者的意图,但是它就是这样儿的…)。最后一行更正了 %
的不同定义。 JavaScript 中负操作数的运算符和 Python .
此外(感谢 Mark Ransom 的提醒),要完全模拟 JavaScript,还需要考虑其编码,即 UTF-16,但带有 surrogate pairs。处理为好像它们由 2 个字符组成。将字符串编码为 utf-16-le
您确保每个 16 位“字”中的第一个字节是最低有效字节,另外,您不会得到 BOM如果你使用 utf-16
你会得到tout court(谢谢 Martijn Pieters)。
关于python-3.x - 在 Python3 中重新创建 JS 按位整数处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55069339/
我正在尝试学习 Fortran,并且看到了很多不同的定义,我想知道他们是否正在尝试完成同样的事情。以下有什么区别? 整数*4 整数(4) 整数(kind=4) 最佳答案 在 Fortran >=90
我以前从未编程过,最近(1 周前)才开始学习!第一门类(class)是函数式编程,使用 Haskell。 我有一项学校作业,我想通过删除一两个步骤来改进它,但我遇到了一个讨厌的错误。 基本上,我创建了
给定以下GraphQL请求和变量: 请求: query accounts($filter:AccountFilter, $first_:String, $skip_:Int) { accounts
我已经搜索了 StackOverflow,但找不到关于如何检查计算器应用程序的数字输入正则表达式的答案,该计算器应用程序将检查每个 keyup 的以下格式(jquery key up): 任何整数,例
类似于我上一篇致歉的文章,但没有那么长篇大论。基本上我想知道当每次重绘调用只重绘屏幕的一小部分时,优化重绘到 JFrame/JPanel 的最佳选择是什么。 此外,除了重绘重载之外,我并不是 100%
所以在我的教科书中有一个使用 f# 的递归函数的例子 let rec gcd = function | (0,n) -> n | (m,n) -> gcd(n % m,m);; 使用此功能,我的教科书
我有一个数据结构,例如表达式树或图形。我想添加一些“测量”功能,例如depth和 size . 如何最好地键入这些函数? 我认为以下三个变体的用处大致相同: depth :: Expr -> Int
这样写比较好 int primitive1 = 3, primitive2 = 4; Integer a = new Integer(primitive1); Integer b = new Inte
我是 Java 8 新手,想根据键对 Map 进行排序,然后在值内对每个列表进行排序。 我试图寻找一种 Java 8 方法来对键和值进行排序。HashMap>映射 map.entrySet().str
这就是我的目标... vector ,int> > var_name (x, pair (y),int>); 其中 x 是 vector var_name 的大小,y 是对内 vector 的大小。
这里是 an answer to "How do I instantiate a Queue object in java?" , Queue is an interface. You can't i
这个问题在这里已经有了答案: Weird Integer boxing in Java (12 个答案) Why are autoboxed Integers and .getClass() val
我们可以使用 C++ STL 做这样的事情吗?如果是,我将如何初始化元素?我试图这样做,但没有成功。 pair,vector>p; p.first[0]=2; 最佳答案 Can we do som
您好,我正在尝试为百分比和整数数组中的数字找到索引。假设 arraynum = ['10%','250','20%','500'] 并且用户发送一个值 15%,这个数字在哪个范围内居住?我可以使用这段
我与三列有关系:ProductName、CategoryID 和 Price。我需要选择仅那些价格高于给定类别中平均产品价格的产品。(例如,当apple(ProductName)是fruit(Cate
我已经坚持了一段时间,我正在尝试将一些数据配对在一起。这是我的代码。 #include #include using namespace std; int main() { pair data(
我收到错误:'(Int, Int)' 与 'CGPoint' 不相同 如何将 (Int, Int) 转换为 CGPoint let zigzag = [(100,100), (100,150)
我在 .cpp 文件中发现了以下代码。我不理解涉及头文件的构造或语法。我确实认识到这些特定的头文件与 Android NDK 相关。但是,我认为这个问题是关于 C++ 语法的一般问题。这些在某种程度上
我将这些输入到 Scala 解释器中: val a : Integer = 1; val b : Integer = a + 1; 我收到消息: :5: error: type mismatch;
C++:vector>v(size);当我试图打印出值时显示 0 作为值,但是当未声明 vector 大小时它显示正确的输出?为什么这样?例如: int x; cin>>x; vector>v(x);
我是一名优秀的程序员,十分优秀!