0

Twitter API 返回 64 位整数的 ID,例如 276403573577891842。我想通过比较它们的 ID 来查看一条推文是否比另一条推文更新。

有没有一种聪明的方法来比较两个 64 位整数,看看在仅支持 32 位整数的 JavaScript 中哪个更大?

4

4 回答 4

3

假设 API 返回字符串,然后将其解析为整数,有两种方法可以做到这一点 - 拆分方式和填充方式;

分裂。这里的想法是将数据拆分为环境可以处理的大小。最大的 32 位数字是0xFFFFFFFF4294967295。现在4294967295..toString().length === 10。所以所有 str 长度 <= 9 的 dec 都应该是 32 位安全的。

function compare(a,b){
    var aa = [0,0,0], ba = [0,0,0], i = 3;
    while (a.length) aa[--i] = parseInt(a.slice(-9)), a = a.slice(0,-9);
    i = 3;
    while (b.length) ba[--i] = parseInt(b.slice(-9)), b = b.slice(0,-9);
    if (aa[0] === ba[0]){
        if (aa[1] === ba[1]) {
            if (aa[2] === ba[2]) return 0;
            else if (aa[2] > ba[2]) return 1;
            return -1;
        } else if (aa[1] > ba[1]) return 1;
        return -1;
    } else if (aa[0] > ba[0]) return 1;
    return -1;
}
// a > b: 1, a = b: 0, a < b: -1

。这次的想法是进行字符串比较,但要做到这一点,我们必须首先确保(字符串)数字具有相同的长度;即用0填充它们。这次'18446744073709551615'.length === 20这么

function pad(str, len) { // Your fav. padding fn
    var pre = '0';
    len = len - str.length;
    while (len > 0) {
        if (len & 1) str = pre + str;
        len >>= 1;
        pre += pre;
    }
    return str;
};

a = pad('276403573577891842',20);
b = pad('50',20);

现在您可以a === b, a < b, a > b正常使用了(除非您使用的是字符串而不是 int)。

于 2012-12-05T20:27:09.453 回答
1

如果它们确实是数字最高的数字 id 是最新的推文,而最低的 id 是最旧的推文,那么进行文本<或比较应该没有任何问题>

于 2012-12-05T19:58:57.537 回答
1

这是我根据接受的答案使用的:

就这样称呼它:if( compare_64('124567891234567890', '>', '124567891234567891') )

function compare_64(a, type, b)
{
var result = false;

var pad_len = (a.length > b.length) ? a.length : b.length;      
var aa = pad(a, pad_len);       
var bb = pad(b, pad_len);

switch(type)
{
    case '<':   
        result = (aa < bb) ? true : false;
        break;
    case '<=':  
        result = (aa <= bb) ? true : false;
        break;
    case '>':   
        result = (aa > bb) ? true : false;
        break;
    case '>=':  
        result = (aa >= bb) ? true : false;
        break;                      
    case '==':  
        result = (aa == bb) ? true : false;
        break;          
}   
return result;
}

// Pad with zeros
function pad(str, len)
{
  var pre = '0';
  len = len - str.length;
  while (len > 0)
{
    if (len & 1) str = pre + str;
    len >>= 1;
    pre += pre;
  }
  return str;
}
于 2012-12-20T23:36:22.840 回答
0

如果一切都失败了,您始终可以将 ID 存储为字符串并将其分成两半,然后您可以将它们分别作为整数进行比较。

于 2012-12-05T20:00:53.040 回答