有没有更简单的方法在另一个 HashMap 中的 HashMap 中创建列表?

Is there an easier way for making a List in a HashMap inside another HashMap?

我正在开发一个程序,该程序授权服务器用户使用生成的密钥访问它,目前我正在处理生成部分。服务器的所有者可以指定密钥的数量、服务器 ID 和密钥的持续时间。我需要存储并检查密钥是否与 serverID 匹配,以便用户可以使用密钥获得访问权限。

我唯一能想到的是一个复杂的HashMap组合,里面有另一个HashMap,HashMap里面有一个List。第一个字符串是每个服务器唯一的服务器 ID,列表是生成的密钥的批次,最后的字符串值是这些密钥的持续时间。

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

问题是,在检查密钥是否与匹配的服务器 ID 一致时,我不知道从哪里开始,因为密钥在列表内的另一个 HashMap 中。我确信还有另一种更简单的方法来实现它,但我还没有想到它,所以请随意不要使用我的方法来解释如何存储和检查值。

它肯定变得笨拙了。是时候用一些经过深思熟虑的 classes 来减少过度生长了。为程序中的概念取个好名字可以更容易地通过所需的逻辑和数据结构进行推理。

class Id {
    String value;
}

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

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

每个键都有一个指向它的服务器的引用,每个服务器都有一个键列表,可以访问它。与其为密钥包分配到期时间,不如为每个密钥指定自己的到期时间。创建一批密钥只是意味着创建一堆密钥并为它们提供相同的到期时间。

Id class 可能只是 String 的简单包装,但它使代码更容易阅读,因为您不必弄清楚有什么不同Strings 是(他们是 ID 吗?名字?)。名称 Id 表明它们是 ID 字符串。

有了 classes 之后,您就可以更轻松地考虑需要哪些额外的数据结构。例如,您需要某种全球地图来按 ID 查找服务器。

public static Map<Id, Server> serversById;

我建议您实现一个键的 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' 属性实现密钥 class 等于)

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

您需要在前一行代码中进行一些空安全检查

非常简单的不同方法将仅使用 HashMap<String,String>。 你可以把钥匙当作 <serverId><delimiter(such as '#')><generatedKey> 和值作为该特定服务器中该密钥的持续时间。

在搜索时,您只需连接 serverId 和密钥并检查持续时间。