哈希值末尾四位需相同的编码挑战及UTF-8编码报错问题
解决哈希后缀编码问题的方案
问题原因
你遇到的UnicodeEncodeError是因为chr(i)生成了U+D800到U+DFFF之间的代理字符,这类字符属于Unicode代理区,必须成对出现才能被UTF-8编码,单独使用时会触发编码失败。
方案1:跳过无效Unicode代理字符
直接在循环中排除代理区的码点,只生成可被UTF-8有效编码的字符:
import hashlib def find_hash_flag(word): # 遍历所有有效Unicode码点(U+0000到U+10FFFF),跳过代理区 for i in range(0x110000): if 0xD800 <= i <= 0xDFFF: continue new_word = word + chr(i) hashed = hashlib.sha256(new_word.encode('utf-8')).hexdigest() if hashed[-4:] == "eeee": print(hashed) return new_word # 若单个字符找不到,可扩展为多字符后缀(长度≤1024) return None word = "orthosemidin" modified_word = find_hash_flag(word) if modified_word: print(modified_word) else: print("you failed miserably")
方案2:直接操作字节串(推荐,更高效)
哈希函数本质处理的是字节序列,我们可以直接在原单词的UTF-8字节后追加合法的UTF-8字节序列,完全绕开Unicode字符的编码问题:
import hashlib def find_hash_flag(word): word_bytes = word.encode('utf-8') # 先尝试追加1个单字节UTF-8字符(0-127,均合法) for b in range(128): new_bytes = word_bytes + bytes([b]) hashed = hashlib.sha256(new_bytes).hexdigest() if hashed[-4:] == "eeee": print(hashed) return new_bytes.decode('utf-8') # 单个字节找不到时,尝试2字节合法UTF-8序列 for b1 in range(0xC0, 0xE0): for b2 in range(0x80, 0xC0): new_bytes = word_bytes + bytes([b1, b2]) hashed = hashlib.sha256(new_bytes).hexdigest() if hashed[-4:] == "eeee": print(hashed) return new_bytes.decode('utf-8') # 可继续扩展到更多字节,确保总后缀字节数≤1024(对应UTF-8字符串长度≤256) return None word = "orthosemidin" modified_word = find_hash_flag(word) if modified_word: print(modified_word) else: print("you failed miserably")
方案优势
- 方案2直接操作字节,避免了Unicode字符的编码转换开销,运行效率更高。
- 两种方案都严格遵守UTF-8编码要求,同时满足后缀长度不超过1024的限制。
内容的提问来源于stack exchange,提问作者Delta HD
相关产品推荐
相关产品推荐

