Fix resource hashes

This commit is contained in:
Ali 2021-04-02 13:05:52 +04:00
parent 2ad13066c5
commit 553d9d793f
2 changed files with 26 additions and 53 deletions

View File

@ -104,9 +104,10 @@ private struct CachedMediaResourceRepresentationKey: Hashable {
static func ==(lhs: CachedMediaResourceRepresentationKey, rhs: CachedMediaResourceRepresentationKey) -> Bool { static func ==(lhs: CachedMediaResourceRepresentationKey, rhs: CachedMediaResourceRepresentationKey) -> Bool {
return lhs.resourceId.isEqual(to: rhs.resourceId) && lhs.representation.isEqual(to: rhs.representation) return lhs.resourceId.isEqual(to: rhs.resourceId) && lhs.representation.isEqual(to: rhs.representation)
} }
var hashValue: Int { func hash(into hasher: inout Hasher) {
return self.resourceId.hashValue hasher.combine(self.resourceId.hashValue)
hasher.combine(self.representation.uniqueId)
} }
} }

View File

@ -1,7 +1,7 @@
import Foundation import Foundation
import Postbox import Postbox
public struct CloudFileMediaResourceId: MediaResourceId { public struct CloudFileMediaResourceId: MediaResourceId, Hashable, Equatable {
let datacenterId: Int let datacenterId: Int
let volumeId: Int64 let volumeId: Int64
let localId: Int32 let localId: Int32
@ -18,13 +18,9 @@ public struct CloudFileMediaResourceId: MediaResourceId {
return "telegram-cloud-file-\(self.datacenterId)-\(self.volumeId)-\(self.localId)-\(self.secret)" 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 { public func isEqual(to: MediaResourceId) -> Bool {
if let to = to as? CloudFileMediaResourceId { 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 { } else {
return false 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 datacenterId: Int32
let photoId: Int64 let photoId: Int64
let sizeSpec: String let sizeSpec: String
@ -108,7 +104,7 @@ public struct CloudPhotoSizeMediaResourceId: MediaResourceId, Hashable {
public func isEqual(to: MediaResourceId) -> Bool { public func isEqual(to: MediaResourceId) -> Bool {
if let to = to as? CloudPhotoSizeMediaResourceId { if let to = to as? CloudPhotoSizeMediaResourceId {
return self.datacenterId == to.datacenterId && self.photoId == to.photoId && self.sizeSpec == to.sizeSpec return self == to
} else { } else {
return false 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 datacenterId: Int32
let documentId: Int64 let documentId: Int64
let sizeSpec: String let sizeSpec: String
@ -192,7 +188,7 @@ public struct CloudDocumentSizeMediaResourceId: MediaResourceId, Hashable {
public func isEqual(to: MediaResourceId) -> Bool { public func isEqual(to: MediaResourceId) -> Bool {
if let to = to as? CloudDocumentSizeMediaResourceId { if let to = to as? CloudDocumentSizeMediaResourceId {
return self.datacenterId == to.datacenterId && self.documentId == to.documentId && self.sizeSpec == to.sizeSpec return self == to
} else { } else {
return false return false
} }
@ -252,7 +248,7 @@ public enum CloudPeerPhotoSizeSpec: Int32 {
case fullSize case fullSize
} }
public struct CloudPeerPhotoSizeMediaResourceId: MediaResourceId, Hashable { public struct CloudPeerPhotoSizeMediaResourceId: MediaResourceId, Hashable, Equatable {
let datacenterId: Int32 let datacenterId: Int32
let photoId: Int64? let photoId: Int64?
let sizeSpec: CloudPeerPhotoSizeSpec let sizeSpec: CloudPeerPhotoSizeSpec
@ -277,7 +273,7 @@ public struct CloudPeerPhotoSizeMediaResourceId: MediaResourceId, Hashable {
public func isEqual(to: MediaResourceId) -> Bool { public func isEqual(to: MediaResourceId) -> Bool {
if let to = to as? CloudPeerPhotoSizeMediaResourceId { 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 { } else {
return false 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 datacenterId: Int32
let thumbVersion: Int32? let thumbVersion: Int32?
let volumeId: Int64? let volumeId: Int64?
@ -363,7 +359,7 @@ public struct CloudStickerPackThumbnailMediaResourceId: MediaResourceId, Hashabl
public func isEqual(to: MediaResourceId) -> Bool { public func isEqual(to: MediaResourceId) -> Bool {
if let to = to as? CloudStickerPackThumbnailMediaResourceId { if let to = to as? CloudStickerPackThumbnailMediaResourceId {
return self.datacenterId == to.datacenterId && self.volumeId == to.volumeId && self.localId == to.localId return self == to
} else { } else {
return false 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 datacenterId: Int
public let fileId: Int64 public let fileId: Int64
@ -435,13 +431,9 @@ public struct CloudDocumentMediaResourceId: MediaResourceId {
return "telegram-cloud-document-\(self.datacenterId)-\(self.fileId)" return "telegram-cloud-document-\(self.datacenterId)-\(self.fileId)"
} }
public var hashValue: Int {
return self.fileId.hashValue
}
public func isEqual(to: MediaResourceId) -> Bool { public func isEqual(to: MediaResourceId) -> Bool {
if let to = to as? CloudDocumentMediaResourceId { if let to = to as? CloudDocumentMediaResourceId {
return self.datacenterId == to.datacenterId && self.fileId == to.fileId return self == to
} else { } else {
return false 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 let fileId: Int64
public var uniqueId: String { public var uniqueId: String {
return "telegram-local-file-\(self.fileId)" return "telegram-local-file-\(self.fileId)"
} }
public var hashValue: Int {
return self.fileId.hashValue
}
public func isEqual(to: MediaResourceId) -> Bool { public func isEqual(to: MediaResourceId) -> Bool {
if let to = to as? LocalFileMediaResourceId { if let to = to as? LocalFileMediaResourceId {
return self.fileId == to.fileId return self == to
} else { } else {
return false 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 let randomId: Int64
public var uniqueId: String { public var uniqueId: String {
return "local-file-\(self.randomId)" return "local-file-\(self.randomId)"
} }
public var hashValue: Int {
return self.randomId.hashValue
}
public func isEqual(to: MediaResourceId) -> Bool { public func isEqual(to: MediaResourceId) -> Bool {
if let to = to as? LocalFileReferenceMediaResourceId { if let to = to as? LocalFileReferenceMediaResourceId {
return self.randomId == to.randomId return self == to
} else { } else {
return false 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 let url: String
public func isEqual(to: MediaResourceId) -> Bool { public func isEqual(to: MediaResourceId) -> Bool {
if let to = to as? HttpReferenceMediaResourceId { if let to = to as? HttpReferenceMediaResourceId {
return self.url == to.url return self == to
} else { } else {
return false return false
} }
} }
public var hashValue: Int {
return self.url.hashValue
}
public var uniqueId: String { public var uniqueId: String {
return "http-\(persistentHash32(self.url))" 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 url: String
public let accessHash: Int64 public let accessHash: Int64
public let size: Int32 public let size: Int32
public func isEqual(to: MediaResourceId) -> Bool { public func isEqual(to: MediaResourceId) -> Bool {
if let to = to as? WebFileReferenceMediaResourceId { if let to = to as? WebFileReferenceMediaResourceId {
return self.url == to.url && size == to.size && accessHash == to.accessHash return self == to
} else { } else {
return false return false
} }
} }
public var hashValue: Int {
return self.url.hashValue
}
public var uniqueId: String { public var uniqueId: String {
return "proxy-\(persistentHash32(self.url))-\(size)-\(accessHash)" 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 fileId: Int64
public let datacenterId: Int32 public let datacenterId: Int32
@ -773,13 +749,9 @@ public struct SecretFileMediaResourceId: MediaResourceId {
self.datacenterId = datacenterId self.datacenterId = datacenterId
} }
public var hashValue: Int {
return self.fileId.hashValue
}
public func isEqual(to: MediaResourceId) -> Bool { public func isEqual(to: MediaResourceId) -> Bool {
if let to = to as? SecretFileMediaResourceId { if let to = to as? SecretFileMediaResourceId {
return self.fileId == to.fileId && self.datacenterId == to.datacenterId return self == to
} else { } else {
return false return false
} }