提问人:Rajib Saha 提问时间:5/10/2020 最后编辑:Maarten BodewesRajib Saha 更新时间:5/11/2020 访问量:88
是否有任何正则表达式可以发现值是否为哈希图?
Is there any regex to find that a value is hashmap or not?
问:
是否有任何正则表达式可以发现值是否为哈希图?
我想构建一个 PL/SQL 函数来表示值是否经过哈希处理?
例如 1. 蒂姆 2.F6099C0932D0E2B13286218F99C265975B33FD84
我的正则表达式应该有智能告诉我表达式 1 (Tim) 没有哈希映射。 而表达式 2 (F6099C0932D0E2B13286218F99C265975B33FD84) 是哈希映射的。
答:
哈希只是特定大小的位数。加密哈希通常具有 256 到 512 位的输出大小,以实现大约 128-256 位的安全性,以实现抗冲突。
哈希映射中使用的其他哈希值可能较小,因为通常不需要防碰撞性;相反,哈希值只需要很好地分布,以便哈希值平均分布。
计算机通常只寻址字节,而不寻址位。因此,哈希值通常是 8 位的倍数。更一般地说,它们通常是 2 的幂,或 2 的 2 或 3 次幂加在一起(160 位为 128 + 32 位)。
现在,要查看这些分布良好的字节,我们需要有某种方式来使用可打印字符查看这些位值。一种方法是以 64 为基数。但是,对于这些相对较短的值,通常首选十六进制,这就是您在问题中遇到的问题。
那么你能看出它是否是哈希值吗?嗯,是也不是。您可以看到它很可能是一个 40 个字符的十六进制值,它表示 20 字节或 20 * 8 = 160 位值。我们还可以“看到”它分布得非常好,并且它不编码可打印的 ASCII(因为有高于 7E 十六进制的值)。
使用正则表达式测试内容是(大写或小写)十六进制非常简单。160 位为 40 个字符也应该很容易。但是,使用正则表达式实际上无法测试它确实是一个分布良好的值。对于任何程序代码来说,这甚至都不容易,因为“随机”值可能时不时地看起来令人惊讶地非随机。除此之外,不仅哈希由分布良好的字节值组成。密文和随机字节值具有相似的属性。
因此,是的,您可以验证输出格式是否与哈希值兼容,但实际上无法测试它是否是哈希值。
正则表达式:
[0-9A-Fa-f]{40}
当然会把“蒂姆”抹去。您可以 100% 确定“Tim”毕竟不是以十六进制编码的 160 位哈希值。
评论
null
/^[A-F\d]{40}$/