生成无重复字符的16位Base32词表并匹配指定SHA512哈希的技术问询
实现符合需求的LISP程序方案
我来帮你搞定这个需求,下面是完整的实现思路和可运行的LISP代码:
核心功能拆解
先把要做的事儿拆成明确的步骤:
- 用标准Base32字符集(A-Z + 2-7,遵循RFC4648规范)生成16位无重复字符的字符串
- 给生成的字符串加上
.txt后缀 - 计算该完整字符串的SHA512哈希值
- 和你提供的已知哈希比对,只输出匹配的结果(要求小写格式)
完整LISP代码实现
(ql:quickload :ironclad) ; 加载哈希计算库,需提前通过Quicklisp安装 ;; 配置参数:替换成你的目标哈希值 (defparameter *base32-chars* "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567") (defparameter *target-sha512-hash* "这里替换成你的已知SHA512哈希") ; 示例:"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855..." (defun generate-unique-base32-word (length) "生成指定长度、无重复字符的Base32字符串" (let ((available-chars (coerce *base32-chars* 'list)) (result '())) (dotimes (i length) (let ((selected-char (nth (random (length available-chars)) available-chars))) (push selected-char result) ;; 移除已选字符,避免重复 (setf available-chars (remove selected-char available-chars)))) (coerce (reverse result) 'string))) (defun compute-sha512-hex (input-string) "计算字符串的SHA512哈希,返回小写十六进制结果" (ironclad:byte-array-to-hex-string (ironclad:digest-sequence :sha512 (ironclad:ascii-string-to-byte-array input-string)))) (defun find-matching-word () "循环生成候选词、计算哈希并比对,输出匹配的小写结果" (loop (let* ((base32-word (generate-unique-base32-word 16)) (full-filename (concatenate 'string base32-word ".txt")) (computed-hash (compute-sha512-hex full-filename))) ;; 比对哈希(忽略大小写,兼容不同格式的输入哈希) (when (string-equal computed-hash *target-sha512-hash*) (format t "~a~%" (string-downcase full-filename)) (return))))) ; 找到匹配后退出,若要持续生成可删除这行 ;; 启动程序 (find-matching-word)
代码细节解释
- 依赖说明:用
ironclad库处理哈希计算,这是Common Lisp里常用的加密工具库,直接用Quicklisp就能安装。 - 无重复字符生成:每次从剩余的Base32字符里随机选一个,选完就从候选池里删掉,保证16位字符串完全没有重复字符。
- 哈希计算:把字符串转成字节数组后计算SHA512,再转成小写十六进制字符串,和目标哈希比对时用
string-equal,自动忽略大小写差异。 - 输出逻辑:找到匹配的结果后,直接输出小写的带后缀文件名,然后退出循环;如果需要批量生成词表再比对,可以把生成的候选词先写入文件,再批量处理。
小提示
- 因为是随机生成,找到匹配的时间完全看运气(毕竟16位无重复Base32的组合数极大),如果有特定的生成规则可以告诉我,我再帮你优化。
- 确保目标哈希是十六进制格式,不管大小写都能正常比对。
内容的提问来源于stack exchange,提问作者Jcfunk
相关产品推荐
相关产品推荐

