XuqmGroup-iOSSDK/Sources/XuqmBugCollectSDK/Fingerprint.swift

34 行
1.2 KiB
Swift

import Foundation
import CryptoKit
///
public enum Fingerprint {
///
public static func compute(type: String, message: String, stacktrace: String) -> String {
let normalizedMessage = normalizeMessage(message)
let topFrames = extractTopFrames(stacktrace, count: 3)
let payload = "\(type):\(normalizedMessage):\(topFrames)"
let data = Data(payload.utf8)
let hash = SHA256.hash(data: data)
return hash.map { String(format: "%02x", $0) }.joined()
}
/// N hex H
private static func normalizeMessage(_ message: String) -> String {
var result = message
//
result = result.replacingOccurrences(of: #"\d+"#, with: "N", options: .regularExpression)
// hex
result = result.replacingOccurrences(of: #"[0-9a-fA-F]{8,}"#, with: "H", options: .regularExpression)
return result
}
///
private static func extractTopFrames(_ stacktrace: String, count: Int) -> String {
let lines = stacktrace.split(separator: "\n").prefix(count)
return lines.joined(separator: "|")
}
}