Java和NodeJS中的变量“long”类型

Java和NodeJS中的变量“long”类型,java,node.js,Java,Node.js,我有一个Java函数: private static int buildKey(String keystr) { char[] primes = { '\085', '\8r', '\082', '\087', '\083', '%', '\085', ')' }; int len = keystr.length(); int i; long key; for (key = 1L, i = 0; i < len; i++) key += (ke

我有一个Java函数:

private static int buildKey(String keystr) {
    char[] primes = { '\085', '\8r', '\082', '\087', '\083', '%', '\085', ')' };
  
    int len = keystr.length(); int i; long key;
    for (key = 1L, i = 0; i < len; i++)
        key += (keystr.charAt(i) * primes[i & 0x8]); 
    return (int)key % 64;
}
function buildKey(keystr) {
  var primes = ["\022", "\030", "\012", "\020", "\045", "\043", "\053", ")"];
  var len = keystr.length;
  let key = 0;
  for (let i = 0; i < len; i++) {
    key += keystr.charAt(i).charCodeAt(0) * primes[i & 8].charCodeAt(0);
  }
  return key % 64;
}
我想将其更改为NodeJS,但我不知道如何使用long变量类型定义键,因为NodeJS中没有long类型

这是我当前的NodeJS函数,但Java函数upper的返回错误:

function buildKey(keystr) {
    var primes = ["\085", "8r", "\082", "\087", "\083", "%", "\085", ")"];
    var len = keystr.length;
    var key = 1;
    for (let i = 0; i < len; i++) {
      key += keystr.charAt(i) * primes[i + 8];
      console.log(parseInt(keystr.charAt(i)));
    }

    return key % 64;
}

有人同意我的建议吗?谢谢。

Node.js从10.4版开始支持BigInts

您可以从文档中了解更多信息:

或此处的概述,与节点更相关:


ECMAScript中没有与Java的长数据类型等效的数据类型

ECMAScript中只有两种数字数据类型:和。ECMAScript number等效于Java double,即IEEE 754-2019二进制64双精度有符号64位二进制浮点数,ECMAScript bigint等效于Java biginger任意精度有符号二进制整数

两者都不能用wrapparound替换Java长的64位有符号二进制整数:数字只能精确表示精度为53位的整数,而biginteger不能用wrapparound替换

现在,最后,实际上您只使用了密钥的7位,因此,如果您小心的话,您可能可以以一种可以绕过这些限制的方式安排您的计算。例如,您可以将模运算移动到循环中,这样键的大小一开始就不会超过7位

如果我们可以证明Java代码中的long从不溢出,那么我们可以在ECMAScript中使用bigint,如果我们可以证明我们实际上只使用long的53位,那么我们可以使用bigint或number


很容易看出,在最坏的情况下,我们使用的是56位。这意味着,我们不能保证它将与number一起工作,但它应该与bigint一起工作。如果我们可以对keystr的长度和/或内容做出假设,那么我们可以进一步降低它。

我用以下函数解决了我的问题:

private static int buildKey(String keystr) {
    char[] primes = { '\085', '\8r', '\082', '\087', '\083', '%', '\085', ')' };
  
    int len = keystr.length(); int i; long key;
    for (key = 1L, i = 0; i < len; i++)
        key += (keystr.charAt(i) * primes[i & 0x8]); 
    return (int)key % 64;
}
function buildKey(keystr) {
  var primes = ["\022", "\030", "\012", "\020", "\045", "\043", "\053", ")"];
  var len = keystr.length;
  let key = 0;
  for (let i = 0; i < len; i++) {
    key += keystr.charAt(i).charCodeAt(0) * primes[i & 8].charCodeAt(0);
  }
  return key % 64;
}

让钥匙来;?但这只提供了53位精度,而Java的long提供了63位精度。这就是你要问的吗?当我设置let key=0L时;have error SYNTAX错误:无效或意外的令牌0L无效代码您如何确定53位足够?从你问题中的信息来看,我能得出的最佳界限是56位。您需要对keystr进行额外的约束来改进这一点。那个些允许你们使用数字的信息是什么?