From 553d9d793f5e6cbb92d83c71223fefe6dcc77cce Mon Sep 17 00:00:00 2001 From: Ali <> Date: Fri, 2 Apr 2021 13:05:52 +0400 Subject: [PATCH] Fix resource hashes --- submodules/Postbox/Sources/MediaBox.swift | 7 +- .../Sources/CloudFileMediaResource.swift | 72 ++++++------------- 2 files changed, 26 insertions(+), 53 deletions(-) diff --git a/submodules/Postbox/Sources/MediaBox.swift b/submodules/Postbox/Sources/MediaBox.swift index e7188645ed..97d8777d84 100644 --- a/submodules/Postbox/Sources/MediaBox.swift +++ b/submodules/Postbox/Sources/MediaBox.swift @@ -104,9 +104,10 @@ private struct CachedMediaResourceRepresentationKey: Hashable { static func ==(lhs: CachedMediaResourceRepresentationKey, rhs: CachedMediaResourceRepresentationKey) -> Bool { return lhs.resourceId.isEqual(to: rhs.resourceId) && lhs.representation.isEqual(to: rhs.representation) } - - var hashValue: Int { - return self.resourceId.hashValue + + func hash(into hasher: inout Hasher) { + hasher.combine(self.resourceId.hashValue) + hasher.combine(self.representation.uniqueId) } } diff --git a/submodules/SyncCore/Sources/CloudFileMediaResource.swift b/submodules/SyncCore/Sources/CloudFileMediaResource.swift index 666706c3d0..ef238fc3ed 100644 --- a/submodules/SyncCore/Sources/CloudFileMediaResource.swift +++ b/submodules/SyncCore/Sources/CloudFileMediaResource.swift @@ -1,7 +1,7 @@ import Foundation import Postbox -public struct CloudFileMediaResourceId: MediaResourceId { +public struct CloudFileMediaResourceId: MediaResourceId, Hashable, Equatable { let datacenterId: Int let volumeId: Int64 let localId: Int32 @@ -18,13 +18,9 @@ public struct CloudFileMediaResourceId: MediaResourceId { return "telegram-cloud-file-\(self.datacenterId)-\(self.volumeId)-\(self.localId)-\(self.secret)" } - public var hashValue: Int { - return self.secret.hashValue - } - public func isEqual(to: MediaResourceId) -> Bool { if let to = to as? CloudFileMediaResourceId { - return self.datacenterId == to.datacenterId && self.volumeId == to.volumeId && self.localId == to.localId && self.secret == to.secret + return self == to } else { return false } @@ -91,7 +87,7 @@ public final class CloudFileMediaResource: TelegramMediaResource { } } -public struct CloudPhotoSizeMediaResourceId: MediaResourceId, Hashable { +public struct CloudPhotoSizeMediaResourceId: MediaResourceId, Hashable, Equatable { let datacenterId: Int32 let photoId: Int64 let sizeSpec: String @@ -108,7 +104,7 @@ public struct CloudPhotoSizeMediaResourceId: MediaResourceId, Hashable { public func isEqual(to: MediaResourceId) -> Bool { if let to = to as? CloudPhotoSizeMediaResourceId { - return self.datacenterId == to.datacenterId && self.photoId == to.photoId && self.sizeSpec == to.sizeSpec + return self == to } else { return false } @@ -175,7 +171,7 @@ public final class CloudPhotoSizeMediaResource: TelegramMediaResource { } } -public struct CloudDocumentSizeMediaResourceId: MediaResourceId, Hashable { +public struct CloudDocumentSizeMediaResourceId: MediaResourceId, Hashable, Equatable { let datacenterId: Int32 let documentId: Int64 let sizeSpec: String @@ -192,7 +188,7 @@ public struct CloudDocumentSizeMediaResourceId: MediaResourceId, Hashable { public func isEqual(to: MediaResourceId) -> Bool { if let to = to as? CloudDocumentSizeMediaResourceId { - return self.datacenterId == to.datacenterId && self.documentId == to.documentId && self.sizeSpec == to.sizeSpec + return self == to } else { return false } @@ -252,7 +248,7 @@ public enum CloudPeerPhotoSizeSpec: Int32 { case fullSize } -public struct CloudPeerPhotoSizeMediaResourceId: MediaResourceId, Hashable { +public struct CloudPeerPhotoSizeMediaResourceId: MediaResourceId, Hashable, Equatable { let datacenterId: Int32 let photoId: Int64? let sizeSpec: CloudPeerPhotoSizeSpec @@ -277,7 +273,7 @@ public struct CloudPeerPhotoSizeMediaResourceId: MediaResourceId, Hashable { public func isEqual(to: MediaResourceId) -> Bool { if let to = to as? CloudPeerPhotoSizeMediaResourceId { - return self.datacenterId == to.datacenterId && self.photoId == to.photoId && self.sizeSpec == to.sizeSpec && self.volumeId == to.volumeId && self.localId == to.localId + return self == to } else { return false } @@ -340,7 +336,7 @@ public final class CloudPeerPhotoSizeMediaResource: TelegramMediaResource { } } -public struct CloudStickerPackThumbnailMediaResourceId: MediaResourceId, Hashable { +public struct CloudStickerPackThumbnailMediaResourceId: MediaResourceId, Hashable, Equatable { let datacenterId: Int32 let thumbVersion: Int32? let volumeId: Int64? @@ -363,7 +359,7 @@ public struct CloudStickerPackThumbnailMediaResourceId: MediaResourceId, Hashabl public func isEqual(to: MediaResourceId) -> Bool { if let to = to as? CloudStickerPackThumbnailMediaResourceId { - return self.datacenterId == to.datacenterId && self.volumeId == to.volumeId && self.localId == to.localId + return self == to } else { return false } @@ -422,7 +418,7 @@ public final class CloudStickerPackThumbnailMediaResource: TelegramMediaResource } } -public struct CloudDocumentMediaResourceId: MediaResourceId { +public struct CloudDocumentMediaResourceId: MediaResourceId, Hashable, Equatable { public let datacenterId: Int public let fileId: Int64 @@ -435,13 +431,9 @@ public struct CloudDocumentMediaResourceId: MediaResourceId { return "telegram-cloud-document-\(self.datacenterId)-\(self.fileId)" } - public var hashValue: Int { - return self.fileId.hashValue - } - public func isEqual(to: MediaResourceId) -> Bool { if let to = to as? CloudDocumentMediaResourceId { - return self.datacenterId == to.datacenterId && self.fileId == to.fileId + return self == to } else { return false } @@ -512,20 +504,16 @@ public final class CloudDocumentMediaResource: TelegramMediaResource { } } -public struct LocalFileMediaResourceId: MediaResourceId { +public struct LocalFileMediaResourceId: MediaResourceId, Hashable, Equatable { public let fileId: Int64 public var uniqueId: String { return "telegram-local-file-\(self.fileId)" } - public var hashValue: Int { - return self.fileId.hashValue - } - public func isEqual(to: MediaResourceId) -> Bool { if let to = to as? LocalFileMediaResourceId { - return self.fileId == to.fileId + return self == to } else { return false } @@ -577,20 +565,16 @@ public class LocalFileMediaResource: TelegramMediaResource { } } -public struct LocalFileReferenceMediaResourceId: MediaResourceId { +public struct LocalFileReferenceMediaResourceId: MediaResourceId, Hashable, Equatable { public let randomId: Int64 public var uniqueId: String { return "local-file-\(self.randomId)" } - public var hashValue: Int { - return self.randomId.hashValue - } - public func isEqual(to: MediaResourceId) -> Bool { if let to = to as? LocalFileReferenceMediaResourceId { - return self.randomId == to.randomId + return self == to } else { return false } @@ -641,21 +625,17 @@ public class LocalFileReferenceMediaResource: TelegramMediaResource { } } -public struct HttpReferenceMediaResourceId: MediaResourceId { +public struct HttpReferenceMediaResourceId: MediaResourceId, Hashable, Equatable { public let url: String public func isEqual(to: MediaResourceId) -> Bool { if let to = to as? HttpReferenceMediaResourceId { - return self.url == to.url + return self == to } else { return false } } - public var hashValue: Int { - return self.url.hashValue - } - public var uniqueId: String { return "http-\(persistentHash32(self.url))" } @@ -701,23 +681,19 @@ public final class HttpReferenceMediaResource: TelegramMediaResource { } } -public struct WebFileReferenceMediaResourceId: MediaResourceId { +public struct WebFileReferenceMediaResourceId: MediaResourceId, Hashable, Equatable { public let url: String public let accessHash: Int64 public let size: Int32 public func isEqual(to: MediaResourceId) -> Bool { if let to = to as? WebFileReferenceMediaResourceId { - return self.url == to.url && size == to.size && accessHash == to.accessHash + return self == to } else { return false } } - public var hashValue: Int { - return self.url.hashValue - } - public var uniqueId: String { return "proxy-\(persistentHash32(self.url))-\(size)-\(accessHash)" } @@ -760,7 +736,7 @@ public final class WebFileReferenceMediaResource: TelegramMediaResource { } -public struct SecretFileMediaResourceId: MediaResourceId { +public struct SecretFileMediaResourceId: MediaResourceId, Hashable, Equatable { public let fileId: Int64 public let datacenterId: Int32 @@ -773,13 +749,9 @@ public struct SecretFileMediaResourceId: MediaResourceId { self.datacenterId = datacenterId } - public var hashValue: Int { - return self.fileId.hashValue - } - public func isEqual(to: MediaResourceId) -> Bool { if let to = to as? SecretFileMediaResourceId { - return self.fileId == to.fileId && self.datacenterId == to.datacenterId + return self == to } else { return false }