【问题标题】:Hash for class-wide key in Ada.Containers.Indefinite_Hashed_MapsAda.Containers.Indefinite_Hashed_Maps 中类范围键的哈希
【发布时间】:2021-08-03 14:01:32
【问题描述】:

我在尝试创建一个不确定的散列映射时遇到了麻烦,因为我想要作为从抽象类继承的关键特定对象,因此 Key_Type 是父类范围的,但我不知道如何处理容器所需的哈希,因为 Hash_Type 是模块化类型。 如何处理类范围键的哈希?

【问题讨论】:

    标签: hash hashmap ada indefinite


    【解决方案1】:

    首先想到的是向 Key_Type 抽象类添加一个“哈希”原始函数,使用该具体类型的组件在每个具体派生密钥类型中实现,然后为map 根据key的实际类型调用这个原始的Hash函数并进行redispatch。

    【讨论】:

    • 好吧,抽象父的所有后代都是通用的,它们不扩展父记录,但我不知道这个问题通常在这种语言中是如何解决的。我的第一个想法是将不定哈希映射所需的 Key_Type 存储为 String,使用 Ada 提供的 String 哈希,并存储后代提供的 external_tag,但我想知道是否有更好的选择,因为我更喜欢使用我自己的哈希并避免使用 String 类型
    • 哈希函数必须对密钥进行哈希处理。 @Albatros23,如果键是字符串,为什么不想使用提供的哈希函数?
    • 您可以使用 Pearson 字符串散列函数 (github.com/jrcarter/PragmARC/blob/Ada-12/…)。这散列到一个字节;如果这还不够值,你可以把你的字符串分成几块,分别散列每块,然后将散列组合成一个更大的值。
    • 为什么不使用标准函数Ada.Strings.Hash?这应该可以完全移植到所有 Ada 编译器。
    • @NiklasHolsti 上面两个 cmets 可以看到我给 Simon 的答案,这是由于 ada 提供的哈希函数上使用了Intrinsic 子程序功能。我不喜欢依赖我听不清楚的东西,因为我是这门语言的新手:P
    猜你喜欢
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-20
    • 2016-12-09
    • 2012-01-26
    • 1970-01-01
    相关资源
    最近更新 更多