Solidity中的HashSet数据结构

HashSet data structure in Solidity

是否有任何方法可以在 Solidity 中实现一个集合,以检查一个元素是否存在,平均 O(1)?我一直在考虑使用没有值的映射对象,这是否比使用数组并迭代以查找元素更快?

是的,就速度而言,您最好使用映射。对我们来说,最接近集合的东西是映射和数组。但是当你想删除一个元素时,迭代的成本非常高。

映射示例

mapping (address => bool) yourMapping; // maps address (key) to boolean (value)

设置示例

contract Contract {

    struct Set {
        uint[] values;
        mapping (uint => bool) is_in;
    }

    Set my_set;

    function add(uint a) public {
         if (!my_set.is_in[a]) {
             my_set.values.push(a);
             my_set.is_in[a] = true;
         }
    }
}