- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个“通过 String.hashValue
获取字符串的散列”代码,我在下面添加了它。此代码在 Xcode 9.4.1 中运行良好。
工作良好意味着每当我关闭应用程序并重新打开它时,hashValue
的结果都是相同的(唯一的)
private func cacheName(of url: String) -> String {
// The url is url of a png image, for example www.imageurl.com/image.png
return "\(url.hashValue)"
}
当我在 Xcode 10 中构建我的项目时,每次我重新启动应用程序(关闭并再次打开应用程序)时结果都会改变。 iOS 版本、设备版本、Swift 版本相同。所以我认为问题是 Xcode 10 改变了一些影响 hashValue
的东西(也许在构建应用程序时配置??)
如果我使用 String.hash
代替,它运行良好。但是在以前的版本中,我保存了hashValue
结果,所以我不想改变它。
如何使 String.hashValue
的结果每次都保持唯一。或者任何建议将不胜感激
最佳答案
Swift 4.2 已经实现了 SE-0206 : 可散列增强。这引入了一个新的 Hasher 结构,它提供了一个随机种子哈希函数。这就是哈希结果每次都不同的原因(因为种子是随机的)。你可以找到 Hasher 结构的实现,生成一个随机种子,here .
如果您想要一个与字符串关联的稳定哈希值,跨设备和应用程序启动,您可以使用此 solution通过 Warren Stringer :
let str = "Hello"
func strHash(_ str: String) -> UInt64 {
var result = UInt64 (5381)
let buf = [UInt8](str.utf8)
for b in buf {
result = 127 * (result & 0x00ffffffffffffff) + UInt64(b)
}
return result
}
strHash(str) //177798404835661
或者有these在 String 上定义的几个扩展:
extension String {
var djb2hash: Int {
let unicodeScalars = self.unicodeScalars.map { $0.value }
return unicodeScalars.reduce(5381) {
($0 << 5) &+ $0 &+ Int($1)
}
}
var sdbmhash: Int {
let unicodeScalars = self.unicodeScalars.map { $0.value }
return unicodeScalars.reduce(0) {
(Int($1) &+ ($0 << 6) &+ ($0 << 16)).addingReportingOverflow(-$0).partialValue
}
}
}
"Hello".djb2hash //210676686969
"Hello".sdbmhash //5142962386210502930
(这是在 Xcode 10、Swift 4.2 上执行的)
关于ios - 在 Xcode 10 中构建时重置应用程序后 String.hashValue 不是唯一的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52440502/
我们发现,如果一个是另一个的负数,则无法通过哈希值来区分两个小数。我们将 Decimals 用作结构中的字段,并且该结构实现了 Hashable 以便能够放入集合中。我们的业务逻辑然后要求所有字段都是
这是 Swift 1.2,我使用的是 Xcode 6.4。以下枚举具有可失败的初始化程序。 enum EstimateItemStatus: Int, Printable { case Pen
由于某种原因,在实现用于其他结构的对象 hashValue 时,程序崩溃了。当我试图获取任何字符串对象的 hashCode 时,它似乎崩溃了。它正在扩展一个结构,但在使用 hashValue 时,
我正在尝试修复 RayWenderlich 网站上不再受支持的旧教程。该警告出现在三个文件中,Chain.swift、Cookie.swift 和 Swap.swift,来自“如何使用 SpriteK
hastable 在对象上使用一些哈希函数来存储。 这个哈希函数本质上是计算对象在表中的位置。 如果我们使用 HashTable 或 HashMap 并且大小不能容纳更多元素,那么这些集合将调整大小以
我不太清楚如何处理编译器发出的不使用 hashValue 而是实现 hash(into:) 的弃用警告。 'Hashable.hashValue' is deprecated as a protoco
我无法理解这一点。 首先我想指出,当我从输入命令行声明这一点时: #define Please 100 #define routine 120 因为“Please”和“routine”具有相同的哈希值
我的 iOS 项目一直面临以下问题(这只是一个警告)。 'Hashable.hashValue' is deprecated as a protocol requirement; conform ty
我最近发现下面的代码以散列冲突告终。 仅供引用,我使用的是 XCode 9.4.1 (9F2000),它使用 Swift 4.1.2 import Foundation let lhs = "あいうえ
在某些情况下和一些代码中,我看到 hashValue 用于将 Bool 转换为 Int。 但是,代码 let someValue = true let someOtherValue = false p
在使用Swift内置的字符串hashValue生成哈希值时,我们发现了两个不同的字符串生成相同哈希值的情况……但是碰撞的原因非常扑朔迷离…… 取这两个字符串: var str1 = """ 00000
我尝试按照本教程进行操作: http://javakart.blogspot.in/2012/12/spring-data-redis-hello-world-example.html 我的问题与此有
我的 iOS 项目一直面临以下问题(这只是一个警告)。 'Hashable.hashValue' is deprecated as a protocol requirement; conform ty
在Swift中为NSObject子类化时,您应该重写哈希还是实现Hashable?此外,你应该重载isEqual:或实现==? 最佳答案 NSObject已经符合所述Hashable协议: exten
如果我有一个字典,例如 { key1 : value1, key2 : value2,..., key17:value17 },并且 2 个键给出相同的散列,比如 key13 和 key5散列时给出
Swift 中的Hashable 协议(protocol)要求您实现一个名为hashValue 的属性: protocol Hashable : Equatable { /// Returns
我有一个“通过 String.hashValue 获取字符串的散列”代码,我在下面添加了它。此代码在 Xcode 9.4.1 中运行良好。 工作良好意味着每当我关闭应用程序并重新打开它时,hashVa
仍在学习 Swift...在为图边设计类时,我想将其抽象并使其成为协议(protocol): protocol GraphEdge: Hashable { typealias Vertex
在 Swift 中子类化 NSObject 时,应该重写 hash 还是实现 Hashable? 此外,您应该重写 isEqual: 还是实现 == 运算符? 最佳答案 NSObject 已经符合 H
Objective-C 中的 .hash 等同于 Swift 中的 .hashValue 吗? 如果不是,Objective-C 中的 .hashValue 是什么? 这与我在这里遇到的一个问题有关(
我是一名优秀的程序员,十分优秀!