检查对象键的存在是否被认为是时间安全的?

Is checking the existence of an objects key considered timing safe?

因此,我正在为一个主要是私有服务器创建一个非常短的用户列表,并将这些用户的登录数据存储在一个对象中。该对象的结构类似于 {"username":"hash"}。我想知道使用 if(users[username) {timingSafeCompare(hash,users[username])} 这样的东西是否被认为是时间安全的。

我想过使用类似

的东西
let u = false
for(un in users) {
    if(timingSafeCompare(username,un) && timingSafeCompare(hash,users[un])) u = username
}
return u

不过,我不确定时间是否安全。

最好的方法是什么?

这取决于引擎的实现。

一些引擎使用哈希表来存储属性并使用动态查找,哈希表的最坏情况时间复杂度为 O(n)。

V8 tries to improve it by using hidden classes,并在最佳情况下将时间复杂度降低到 O(1)。然而,随着 props 数量的增加,它会退回到动态查找。

对于 Set V8 uses ordered hash table 也具有 O(1) 时间复杂度。

如果您还打算删除 users,那么 SetMap 可以胜过对象。使用 Set 也使它在语义上更正确。