Есть ли более простой способ сделать список в HashMap внутри другого HashMap? - PullRequest
0 голосов
/ 31 декабря 2018

Я работаю над программой, которая разрешает пользователю сервера обращаться к нему с помощью сгенерированного ключа, и в настоящее время я работаю над частью генерации.Владелец сервера может указать, сколько ключей, идентификатор сервера и продолжительность ключей.Мне нужно сохранить и проверить, соответствует ли ключ идентификатору сервера, чтобы пользователи могли использовать ключи для получения доступа.

Единственное, о чем я мог подумать, это сложная комбинация HashMap с другой HashMap внутри, с List внутритот хэшмэп.Первая строка - это идентификатор сервера, который уникален для каждого сервера, список - для пакета сгенерированных ключей, а окончательное значение строки - для продолжительности этих ключей.

static HashMap<List<String>, String> keyTimeBundle = new HashMap<>();
static List<String> generatedKeys = new ArrayList<>();
static HashMap<String, HashMap<List<String>, String>> clientGeneratedKeys = new HashMap<>();

Проблема заключается в том, чтоЯ понятия не имею, с чего начать при проверке, идет ли ключ с совпадающим идентификатором сервера, потому что ключ находится в другой HashMap внутри списка.Я уверен, что есть еще один более простой способ реализовать это, но я еще не подумал об этом, поэтому не стесняйтесь не использовать мой метод, чтобы объяснить, как хранить и проверять значения.

Ответы [ 3 ]

0 голосов
/ 31 декабря 2018

Я бы посоветовал вам реализовать POJO-представление ключа

public class Key{
    private String key;
    //duration is key specific this gives you more flexibility in issuing temporary individual keys
    private long duration;
    ....

, а затем сохранить каждый список ключей сервера на карте

HashMap<String, List<Key>> clientGeneratedKeys = ...

Что касается проверки, вы проверяете,список ключей этого сервера содержит представленный ключ (не забудьте реализовать класс Key, равный на основе сравнения атрибута 'key')

clientGeneratedKeys.get("Server Id").contains("submitted key");

, вам понадобятся некоторые проверки нулевой безопасности в предыдущей строкекод

0 голосов
/ 31 декабря 2018

Очень простой другой подход будет использовать только HashMap<String,String>.Вы можете взять ключ как <serverId><delimiter(such as '#')><generatedKey> и значение как продолжительность этого ключа на этом конкретном сервере.

При поиске вы просто объединяете serverId и ключ и просто проверяете продолжительность.

0 голосов
/ 31 декабря 2018

Это определенно становится громоздким.Пришло время сократить чрезмерный рост с помощью тщательно продуманных занятий.Присвоение добрых имен понятиям в ваших программах значительно упрощает рассуждение с помощью необходимой логики и структур данных.

class Id {
    String value;
}

class Server {
    Id id;
    List<Key> keys;
}

class Key {
    Id id;
    Server server;
    Instant expirationDate;
}

Каждый ключ имеет ссылку на сервер, для которого он предназначен, и каждый сервер имеетсписок ключей, которые дают к нему доступ.Вместо того, чтобы назначать время истечения для связок ключей, присвойте каждому ключу свое время истечения.Создание пакета ключей просто означает создание группы ключей и предоставление им одинакового срока действия.

Класс Id может быть просто оболочкой для String, но это делает код немноголегче читать, так как вам не нужно выяснять, какие String есть (это идентификаторы? имена?).Имя Id дает понять, что это строки идентификаторов.

Когда у вас есть классы, вам будет проще думать о том, какие дополнительные структуры данных вам понадобятся.Например, вам понадобится какая-то глобальная карта для поиска серверов по идентификатору.

public static Map<Id, Server> serversById;
...