You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 08:09:22