关联数组的键$ {!a [@]}和值$ {a [@]}是否以相同顺序扩展?

时间:2019-01-22 10:24:45

标签: bash associative-array

在bash中,关联数组(也称为字典或哈希图)是无序的。对于关联数组a,我们可以使用${!a[@]}列出所有键(也称为索引),并使用${a[@]}列出所有值。我知道这些结构不会按固定顺序扩展。我想知道是否至少有 some 个保证。我找不到。但是,[ "${a[*]}" = ${a[*]} ]在任何实现中都会失败是不现实的。同样,似乎${!a[@]}的扩展顺序与${a[@]}相同。如果在x的位置 n 处找到键${!a[@]},则将在{{1}的位置 n 处找到值${a[x]} }。当然,我们假设${a[@]}a的扩展之间未修改${!a[@]}

示例:

${a[@]}

问题

  • 对于任何现有的bash版本和关联数组declare -A a=([x]=1 [y]=2 [z]=3) printf %s\\n "${!a[*]}" "${a[*]}" # As output I would expect one of the following blocks ... # (corresponding keys and values are in the same column) x y z x z y y x z y z x z x y z y x 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 # ... but never something like ... # (at least one key doesn't share a column with its value) x y z x y z y x z 1 3 2 2 3 1 2 3 1 ... a${!a[@]}是否可以以这样的方式扩展:键和它们的对应值具有不同的顺序?换句话说:

${a[@]}

奖金问题

  • bash手册中的# Are there values for a and i # such that this script could print "different order" declare -A a=(...) declare -i i=... keys=("${!a[@]}") values=("${a[@]}") [ "${a[keys[i]]}" != "${values[i]}" ] && echo "different order" ${!a[*]} 的扩展订单上是否有任何担保 ?或其他一些官方文件?
  • 我们可以从实施本身中承担更多/其他保证吗??这些保证中的一些是否随着bash版本的不同而改变?这些保证中的某些保证在即将到来的bash版本中可能会改变吗?

1 个答案:

答案 0 :(得分:1)

在bash联机帮助页中,我没有看到任何有关关联数组的键排序的信息(我使用的是4.3.48)。查看bash 5.0(hashlib.c)的源代码还表明,bash使用最简单的基于XOR哈希的算法,没有任何随机化,因此不应该在进程或机器之间随机化顺序,这与您使用的其他一些更复杂的算法不同d找到Perl。

话虽如此,但依赖于特定的键顺序或恒定的顺序仍然是不明智的,因为Perl-land的经验告诉我们。而且,由于bash联机帮助页中没有说明订购,因此无法保证。哈希实现可以随时替换或重写。