将java方法转换为jQuery函数

时间:2013-01-31 11:04:27

标签: java javascript jquery

我必须使用jQuery兼容java函数。 jQuery Real Person captcha验证函数由java编写。我想在jQuery中验证验证码。所以,我试着在jQuery中编写java函数。但是该功能无法返回正确的值。

爪哇:

private String rpHash(String value) { 
   int hash = 5381; 
   value = value.toUpperCase(); 
   for(int i = 0; i < value.length(); i++) { 
     hash = ((hash << 5) + hash) + value.charAt(i); 
   } 
   return String.valueOf(hash); 
}

jQuery的:

function rpHash(value) { 
  hash = 5381; 
  value = value.toUpperCase(); 
  for($i = 0; $i < value.length; $i++) { 
    hash = ((hash << 5) + hash) + value.charAt($i); 
  } 
  return hash; 
} 

1 个答案:

答案 0 :(得分:3)

如果您发布预期结果(来自Java)和实际结果(来自JavaScript),它会有所帮助。我使用字符串"abc"对其进行了测试,Java函数返回193450027,而JavaScript版本返回"00177573ABC"。看看这些结果,问题就更容易发现了。

问题是你没有正确翻译循环体。 hashint,因此((hash << 5) + hash)也是int。但是,value.charAt(i) char 。当Java需要向int添加char时会发生什么?简单:char是由两个字节表示的Unicode字符。 char扩展为具有相同Unicode值的int,然后添加到int

然而,JavaScript的工作方式却截然不同。 hashnumbervalue.charAt(i)string,只有一个字符。向number添加string时,+被解释为两个string连接,因此结果也是{ {1}}。由于JavaScript不是静态类型,因此将string的值从hash更改为number是完全合法的。

在进一步的迭代中,string将(很可能)是一个hash,同时包含数字和非数字字符。因此,在评估string时,转移操作所需的从hash << 5string的隐式转换会无声地失败并返回number。由于与上述相同的原因,0以及+ hash会成为连接。

因此,正确的翻译是检索字符代码而不是字符

+ value.charAt($i)

这将正确地导致预期添加两个hash = ((hash << 5) + hash) + value.charCodeAt($i); s。

在不相关的说明中,您应该在初始化中编写number而不是var $i = 0,以防止$i = 0泄露到全局范围。这同样适用于$i,应将其声明为hash。此外,惯例是前缀为var hash = 5381的变量表示jQuery对象,而$则不是。你最好用Java命名它$i