Итак, я создаю довольно короткий список пользователей для в основном частного сервера, и данные для входа для этих пользователей хранятся в объекте. Объект структурирован как {"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

Но опять же, я не уверен, безопасно ли это по времени.

Что было бы лучшим подходом к этому?

1
Werlious 21 Мар 2021 в 11:56

1 ответ

Лучший ответ

Это зависит от реализации двигателя.

Некоторые движки используют хэш-таблицы для хранения свойств и динамического поиска, хеш-таблицы имеют временную сложность O (n) наихудшего случая.

V8 пытается улучшить его, используя скрытые классы, и снижает временную сложность до O (1) в лучшем случае. Однако по мере роста количества реквизитов он возвращается к динамическому поиску.

Для Set V8 использует упорядоченную хеш-таблицу, которая также имеет временную сложность O (1).

Если вы также собираетесь удалить users, тогда Set или Map могут превзойти объект. Использование Set также делает его более семантически правильным.

2
Mike Ezzati 21 Мар 2021 в 20:12