如果我认为这是一个完全相同的SWIFT UUID,那么在随后的代码运行中,我会得到不同的hashValue.在一次运行中,它是一致的.

例如:

func UUIDTest() {
    let uuid = UUID(uuidString: "00000000-0000-0000-0000-000000000001")
    
    let h = uuid.hashValue
    
    print("\(String(describing: uuid)) -> \(h)")
    
    /*
     
     Run #1:
     Optional(00000000-0000-0000-0000-000000000001) -> 8072320274727128679

     Run #2:
     Optional(00000000-0000-0000-0000-000000000001) -> -2566074080105686496

     */
}

The documentation is mum取决于散列值是否完全是UUID的函数,或者是否还有其他成分.

有没有一些我还不了解的关于Hasable的理解?

推荐答案

不仅是UUID,整个SWIFT Hashable协议都是不确定的,这是故意的.

摘自Hasher个文档.

在SWIFT程序的执行过程中,Hasher保证只要向其提供完全相同的字节序列,它将始终生成相同的哈希值.然而,底层散列算法旨在展示雪崩效应:对种子或输入字节序列的轻微更改通常会在生成的散列值中产生剧烈变化.

不要在程序的执行中保存或以其他方式重复使用哈希值.Hasher通常是随机种子的,这意味着它将返回您程序的different values on every new execution%.Hasher实现的散列算法本身可以在标准库的任何两个版本之间改变.

这是一件好事,原因有很多.安全就是其中之一(参见散列洪泛攻击).它还防止程序员对他们不是为之设计的东西使用散列值(例如,等式比较).

Swift相关问答推荐

SWIFT闭包使用的是陈旧的值,即使它是S@转义

从后台线程获取@发布属性的值(不更改它)是正确的吗?

在SWIFT中使用Objective-C struct 时出错(在作用域中找不到类型)

';NSInternal不一致异常';,原因:';可见导航栏Xcode 15.0 Crash请求布局

无论玩家移动到视图内的哪个位置,如何使用 SpriteKit 让敌人向玩家emits 子弹?

在SwiftUI中如何预览嵌套的ScrollView,以避免触发可刷新修饰符

在 Swift 5.7 中使用协议作为类型时什么时候需要写 `any`

如何在类中打印函数

Swift并发:为什么不在其他后台线程上执行任务

为什么 SwiftUI 不在工具栏菜单中反映 @State 属性值?

`let case(value)` 和 `case(let value)` 之间的区别 (Swift)

如何获取 NSRunningApplication 的参数?

如何在不阻塞 UI 更新的情况下使用 Swift Concurrency 在后台执行 CPU 密集型任务?

在 SwiftUI 中,如何在 UIView 内或作为 UIView 使用 UIHostingController?

让我的函数计算数组 Swift 的平均值

在 Swift 中获取双精度的小数部分

在 iOS 中使用 Swift 保存 PDF 文件并显示它们

Swift 中 NSFetchRequest 的多个 NSPredicates?

自动布局:获取 UIImageView 高度以正确计算单元格高度

Swift 中的可选数组与空数组