【问题标题】:How exactly does map sort keys?map 排序键究竟如何?
【发布时间】:2014-05-25 21:24:01
【问题描述】:

我正在用 javascript 对 json 进行数字签名,以供 c++ 验证。我正在使用json spirit 来解析使用maps 的json 为json Objects,所以Objects 需要以与c++ maps 相同的方式排序。

An Object can easily be sorted by javascript

function sortObject(o) {
    var sorted = {},
    key, a = [];

    for (key in o) {
        if (o.hasOwnProperty(key)) {
            a.push(key);
        }
    }

    a.sort();

    for (key = 0; key < a.length; key++) {
        sorted[a[key]] = o[a[key]];
    }
    return sorted;
}

但是,我不确定exact sorting method that c++ uses

上面的代码是否足以让 javascript 以与 map 键排序相同的方式对 Object 键进行排序?如果没有,怎么办?

【问题讨论】:

  • 不能保证对象的顺序......
  • @epascarello 看起来大多数浏览器都是按插入排序的,除了 Chrome 在可用时按整数排序。
  • 为什么不在编码之后(分别在解析之前)对二进制表示进行签名(并验证)?那应该避免这样的排序问题。
  • @Perseids 我在考虑这个问题,但是 json-spirit 似乎无法将对象视为字符串,并且签名数据(消息、密钥、签名)是子对象。我已经用 Chrome 进行了测试,我可以确认它确实通过插入来维持秩序。不能对其他浏览器说同样的话:/
  • 一些嵌套序列化怎么样?将有效负载对象序列化为 json 并创建一个仅包含签名和序列化有效负载的新对象,然后再次将其序列化以进行传输。在接收端,您反序列化外部 json,检查签名并反序列化有效负载。

标签: javascript c++ sorting map key


【解决方案1】:

您基本上是在问this 问题。正如最佳答案所述:

是的,这是 [迭代顺序] 有保证的。此外, *begin() 给你最小的和 *rbegin() 由比较运算符确定的最大元素,以及表达式所针对的两个键值 a 和 b !compare(a,b) && !compare(b,a) 为真被认为是相等的。这 默认比较函数是 std::less。

【讨论】:

  • 谢谢尼克拉斯菲!是不是相当于js中默认的Array.sort函数?提前非常感谢您!
  • @Gracchus 的顺序是地图模板参数cplusplus.com/reference/map/map 中指定的顺序。默认情况下,字符串将是字典排序。
猜你喜欢
  • 2021-06-20
  • 2013-05-08
  • 1970-01-01
  • 1970-01-01
  • 2011-09-17
  • 1970-01-01
  • 2023-04-04
  • 2020-11-08
  • 2012-11-09
相关资源
最近更新 更多