实现一个基于哈希的分布式实时协作编辑器(支持冲突解决和版本合并)
字数 332 2025-11-04 20:47:20
实现一个基于哈希的分布式实时协作编辑器(支持冲突解决和版本合并)
题目描述:设计一个基于哈希的分布式实时协作编辑器系统,允许多个用户同时编辑文档。系统需要解决编辑冲突,合并不同版本,并保持最终一致性。使用哈希算法进行版本标识和内容校验。
解题过程:
-
问题分析
- 多个用户同时编辑同一文档会产生并发冲突
- 需要跟踪每个操作的版本历史
- 必须保证最终所有用户看到相同的内容
- 使用哈希值作为版本标识,确保内容完整性
-
数据结构设计
class Operation: def __init__(self, type, position, text, version, author): self.type = type # 'insert' 或 'delete' self.position = int # 操作位置 self.text = str # 操作的文本 self.version = str # 版本哈希 self.author = str # 作者标识 self.timestamp = float # 时间戳 class Document: def __init__(self): self.content = "" # 文档内容 self.version_history = {} # 版本哈希 -> 内容哈希 self.operations = [] # 操作记录 -
版本哈希计算
import hashlib def calculate_version_hash(content, previous_version, operations): # 组合内容、前驱版本和操作记录计算哈希 data = content + previous_version + str([op.__dict__ for op in operations[-10:]]) return hashlib.sha256(data.encode()).hexdigest() -
操作转换算法(关键)
- 当两个操作在相同位置并发发生时,需要转换操作顺序
def transform_operation(op1, op2): # 如果op2在op1之前发生,不需要转换 if op2.position < op1.position: return op1 # 如果都是插入操作,且位置相同 if op1.type == 'insert' and op2.type == 'insert': if op1.position <= op2.position: new_op = Operation(op1.type, op1.position, op1.text, op1.version, op1.author) else: new_op = Operation(op1.type, op1.position + len(op2.text), op1.text, op1.version, op1.author) # 处理插入和删除的冲突 elif op1.type == 'insert' and op2.type == 'delete': if op1.position <= op2.position: new_op = Operation(op1.type, op1.position, op1.text, op1.version, op1.author) else: new_op = Operation(op1.type, op1.position - len(op2.text), op1.text, op1.version, op1.author) return new_op -
冲突解决策略
def resolve_conflict(local_ops, remote_ops, current_content): # 使用操作转换解决冲突 transformed_ops = [] for remote_op in remote_ops: transformed_op = remote_op for local_op in local_ops: # 如果操作有重叠,进行转换 if operations_overlap(transformed_op, local_op): transformed_op = transform_operation(transformed_op, local_op) transformed_ops.append(transformed_op) # 应用转换后的操作 for op in transformed_ops: current_content = apply_operation(current_content, op) return current_content def apply_operation(content, operation): if operation.type == 'insert': return content[:operation.position] + operation.text + content[operation.position:] else: # delete return content[:operation.position] + content[operation.position + len(operation.text):] -
分布式同步协议
class CollaborativeEditor: def __init__(self): self.document = Document() self.pending_operations = [] self.vector_clock = {} # 作者 -> 最后已知版本 def local_edit(self, operation): # 生成本地操作 operation.version = self.document.version_history.get(current_version, "") self.pending_operations.append(operation) self.document.content = apply_operation(self.document.content, operation) # 更新版本 new_version = calculate_version_hash( self.document.content, operation.version, self.pending_operations ) self.document.version_history[new_version] = self.document.content def receive_remote_operation(self, remote_operation, remote_operations): # 接收远程操作并解决冲突 if self.has_conflict(remote_operation): # 解决冲突 resolved_content = resolve_conflict( self.pending_operations, remote_operations, self.document.content ) self.document.content = resolved_content else: # 无冲突,直接应用 self.document.content = apply_operation(self.document.content, remote_operation) # 更新版本历史 new_version = calculate_version_hash( self.document.content, remote_operation.version, self.pending_operations + [remote_operation] ) self.document.version_history[new_version] = self.document.content -
完整性验证
def verify_document_integrity(document, claimed_version): # 验证文档内容是否与声称的版本匹配 current_hash = hashlib.sha256(document.content.encode()).hexdigest() expected_hash = document.version_history.get(claimed_version, "") return current_hash == expected_hash
这个解决方案使用哈希算法确保版本标识的唯一性和内容完整性,通过操作转换算法解决编辑冲突,实现分布式实时协作编辑功能。