问题标签 [hashable]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
swift - 如何在 Swift 中从 hashValue 实现 hash(into:)?
我不太清楚如何处理来自编译器的弃用警告,不要使用hashValue
而是实现hash(into:)
.
'Hashable.hashValue' 作为协议要求已被弃用;通过实现 'hash(into:)' 来使类型 'MenuItem' 符合 'Hashable'
来自Swift 的回答:“Hashable.hashValue”作为协议要求已被弃用;有这个例子:
我确实有这个结构,可以定制PagingItem
羊皮纸(https://github.com/rechsteiner/Parchment)。
swift - Swift 5:如何创建包含类类型的集合(适用于 NSXPCInterface)
在Apple 文档中NSXPCInterface.setClasses(_:for:argumentIndex:ofReply:)
,对于 Swift,第一个参数描述为:
一个包含 Class 对象的 NSSet ——例如, [MyObject class]。
嗯,看起来好像有人忽略了从 Objective-C 到 Swift 的更新。对于 Swift,我认为它应该类似于
包含类类型的集合
(有人请纠正我的措辞。)但是你如何制作一个包含类类型的集合? 编译器不允许我声明Set
其成员类型不是不符合的Hashable
。这是有道理的,因为需要散列来保持成员之间的唯一性。但是 Swift 中的类类型似乎不是可散列的。在任何 Swift 文件或操场上试试这个……</p>
编译器抱怨:
参数类型 'Foo.Type' 不符合预期的类型 'Hashable'
或者,更广泛地说,有人知道如何NSXPCInterface.setClasses(_:for:argumentIndex:ofReply:)
在 Swift 5 中使用吗?
python - 可散列和不可变之间有什么区别?
- immutable 和 hash-able 和有什么区别?
- 这是什么意思“如果一个对象的哈希值在其生命周期内永远不会改变,那么它是可哈希的?”
- 元组是不可变和可散列的还是仅不可变的?为什么 ?
swift - Swift - X == -X 的 Decimal 的 hashValue 相同,不能用于比较 hashValues
我们发现,如果一个是另一个的负数,则无法通过它们的 hashValue 区分两个小数。我们使用 Decimals 作为结构中的字段,并且该结构实现了 Hashable 以便能够放入集合中。然后,我们的业务逻辑要求所有字段都是唯一的,因此所有字段并组合为 hashValue。这意味着我们的十进制字段是另一个的负数并且其余字段实际上相等的两个结构,那么整个结构被认为是相等的。这不是我们想要的。
游乐场代码:
doubleLiteral
使用而不是进行测试时也会发生同样的情况integerLiteral
。
解决方法是直接比较小数,如果其他部分需要,可以选择将其包含在 hashValue 中。
这种行为是有意的吗?尾数是相同的,所以我猜他们不被认为是相等的原因是因为符号不包含在十进制的 hashValue 中?
swift - 具有可互换属性的可散列结构?
我需要使自定义结构符合,Hashable
以便可以将其用作 Dictionary 键类型。但是,挑战在于结构的两个属性可以互换,以识别唯一实例。
这是一个简化的示例来说明问题:
识别唯一性的两个重要属性MultiplicationQuestion
是leftOperand
和rightOperand
,但它们的顺序无关紧要,因为“1 x 2”与“2 x 1”本质上是同一个问题。(由于我不会在这里讨论的原因,它们需要作为单独的属性保存。)
我尝试如下定义一致性,因为我知道在我定义的相等性和内置的 Hasher 将要做什么Hashable
之间存在冲突:==
我通过创建两组问题并对它们执行各种操作来测试这一点:
希望的结果(一厢情愿)是commonQuestions
包含一个问题(1 x 2),而allQuestions
包含九个问题,已删除重复项。
然而,实际结果是不可预测的。如果我多次运行操场,我会得到不同的结果。大多数时候,commonQuestions.count
是 0,但有时是 1。大多数时候,allQuestions.count
是 10,但有时是 9。(我不确定我在期待什么,但这种不一致肯定是一个惊喜!)
如何使该hash(into:)
方法为属性相同但相反的两个实例生成相同的哈希?
python - 为什么 set 运算符适用于 dict_key 视图对象而不适用于等效的 set 方法?
编辑:可能重复。只有在发布此问题并查看“相关问题”之后,我才能找到为什么在类似集合的对象上不支持像 .intersection() 这样的集合方法?,这个问题可能足够相似,可以重复。
我试图查看字典中的键是否是集合的子集,并且遇到了dict_keys
视图对象和集合方法/运算符的一些令人困惑的行为。
集合和视图之间的区别指出:
只有 dict.keys() 字典视图始终是一个集合(它的行为类似于一个集合,但具有字典的实时视图)
https://docs.python.org/3/library/stdtypes.html#dictionary-view-objects文档指出
键视图类似于集合,因为它们的条目是唯一且可散列的。... 对于类似集合的视图,为抽象基类 collections.abc.Set 定义的所有操作都可用(例如,==、< 或 ^)。
并且https://docs.python.org/2/library/stdtypes.html#set设置类型文档意味着运算符(<=、| 等)等同于方法.issubset()
等union()
。
然而,以下代码并未反映这些断言:
s.issuperset(dic.keys())
但是确实返回True
。
当所有迹象都表明 .issubset() 方法可以工作时,为什么会出现分散行为?
swift - Swift hash(into:) Hashable 协议要求的缓存结果
我有一个类在集合和字典中被大量使用。出于性能原因,此类Hashable
以旧方式实现并缓存计算的哈希:
在 Xcode 10.2 中,我看到一个警告,该警告已hashValue
被弃用,很快将不再是协议要求。
困扰我的是无论如何都缺乏缓存计算哈希的能力,因为hash(into:)
它不返回任何东西。
在操场上考虑以下示例
您将看到以下日志
我不知道,为什么我们看到 3 个调用而不是 2 个,但我们确实看到了 =)。
因此,每次您使用相同的实例作为字典键或将此实例添加到集合中时,您都会收到一个新hash(into:)
调用。
在我的代码中,这样的开销被证明是非常昂贵的。有谁知道解决方法?
python - How to remove duplicate elements of, list of dictionaries in python
I have a list of campuses:
each campus belongs to a school with a unique dlin. I want to have a list in which I have some other lists, each having a few dictionaries. I run the below code:
the result is:
I have to either remove the duplicate members from schools or modify the code such that I do not get duplicates. When I try to remove duplicates from schools, I see that dic item is not hashable so I can not do it. To solutions are available that are somewhat similar to my problem. Remove duplicates from list of dictionaries within list of dictionaries Remove duplicate dict in list in Python However, I cannot figure out what to do? does anybody know how to solve the problem?
what I expect to get is:
swift - Swift:将类的 ObjectID 用于可散列协议会导致 set.contains 方法中的随机行为。代码有什么问题?
我有少量存储在集合中的自定义类实例。我需要检查该集合中是否包含某个元素。匹配的条件必须是对象的 ID,而不是其内容。
为简化起见,假设一个具有整数 var 作为唯一属性的类,以及该类的两个不同实例,都持有数字 1。
直接比较这些实例应该返回 true,但是当对第一个实例的引用存储在集合中时,查询该集合是否包含对第二个实例的引用应该返回 false。
因此我使用对象的 ObjectIdentifier 来生成可散列协议所需的散列函数。
据我了解,Swift Set 的 .contains 方法首先使用哈希值,如果发生哈希冲突,则使用 equatable 方法作为备用方法。
但是在以下可以在操场上运行的代码中,我得到了随机结果:
如果您在 XCode Playground 中运行上述代码并手动重新启动 Playground 执行,则每次运行的最后一行都会产生不同的结果。期望的行为是每次都得到“假”。
那么实现所描述的行为的正确方法是什么?