如何在Raku中实现Python hashlib模块的digest函数?
在Raku中实现类似Python hashlib的digest功能
问题背景
在Python中,hashlib模块的digest()函数可以返回原始字节串形式的摘要,示例代码如下:
import hashlib id = "65766" song_id = bytearray(id, "u8") m = hashlib.md5(song_id) result = m.digest() print(result) # Output # b"\xc9j\xa4/vy}+'\xe6\x8e\xe4\xcc\xd8\xa8\xc8"
我在Raku中使用Digest::MD5模块时,发现它没有提供类似的digest子程序,当前代码如下:
my $d = Digest::MD5.new; my $id = "65766"; my Buf $md5-buf = $d.md5_buf($id); # ???
不想通过Inline::Python或Inline::Perl5跨语言调用,请问如何在Raku中实现等价于Python digest()的功能?
解决方案
完全可以在Raku中实现等价功能,核心是利用Digest::MD5返回的Buf对象——它本身就是原始字节的容器,和Python digest()返回的字节串是等价的。
1. 直接获取原始字节容器
md5_buf方法返回的Buf对象已经对应Python的字节串结果,直接使用即可:
use Digest::MD5; my $id = "65766"; my Buf $md5-buf = Digest::MD5.md5_buf($id); # 输出原始字节的Buf表示 say $md5-buf; # 输出:Buf.new(0xc9, 0x6a, 0xa4, 0x2f, 0x76, 0x79, 0x7d, 0x2b, 0x27, 0xe6, 0x8e, 0xe4, 0xcc, 0xd8, 0xa8, 0xc8)
2. 生成与Python格式完全一致的字符串输出
如果需要得到和Python print(result)完全相同的字符串形式,可以手动将每个字节格式化为十六进制转义序列,同时保留可打印ASCII字符:
use Digest::MD5; my $id = "65766"; my Buf $md5-buf = Digest::MD5.md5_buf($id); # 格式化出Python风格的字节串表示 my $digest-str = $md5-buf.map({ my $char = chr(.Int); # 对可打印ASCII字符直接保留,否则用\x转义 $char ~~ /<:ASCII:Print>/ ?? $char !! "\\x{.fmt('%02x')}" }).join; say "b\"$digest-str\""; # 输出:b"\xc9j\xa4/vy}+'\xe6\x8e\xe4\xcc\xd8\xa8\xc8"
这段逻辑和Python处理字节串输出的规则一致,会自动区分可打印与不可打印字符。
内容的提问来源于stack exchange,提问作者chenyf
相关产品推荐
相关产品推荐

