1

因此,我正在为一个主要是私有服务器的用户提供一个非常短的列表,并将这些用户的登录数据存储在一个对象中。该对象的结构类似于 {"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

但同样,我不确定这是否时间安全。

最好的方法是什么?

4

1 回答 1

2

这取决于引擎的实现。

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

V8 尝试通过使用隐藏类来改进它,并在最佳情况下将时间复杂度降低到 O(1)。然而,随着道具数量的增加,它又回到了动态查找。

对于Set V8使用有序哈希表,它也具有 O(1) 时间复杂度。

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

于 2021-03-21T10:23:11.397 回答