【问题标题】:How to Convert SHA1 and MD5 text-values to binary? (sql)如何将 SHA1 和 MD5 文本值转换为二进制? (SQL)
【发布时间】:2013-03-22 10:26:09
【问题描述】:

所以我在数据库中有 SHA1 varchar 字符串,例如 'LQSVPLQSVPSYKLMTY7P5SVPSYN54CMGU' = 32 字节。如何将其转换为二进制刺痛?

SELECT BINARY('LQSVPLQSVPSYKLMTY7P5SVPSYN54CMGU'); 

不是我要找的。它将是相同的 32 字节字符串,但在 BLOB 中。我需要先从 sha1 获取价值。 Mysql\Postgresql 有什么方法可以做到吗?我也对类似的 MD5 sting 转换感兴趣。有没有通用的方法?

这个问题与Storing hexadecimal values as binary in MySQL有关。

【问题讨论】:

  • 这里出了点问题。 SHA1 的二进制形式总是正好 20 个字节,十六进制形式是 40 个字节。 MD5 分别是 16 个字节和 32 个十六进制,但粘贴的字符串不能是十六进制编码的二进制。此外,这些哈希生成像所呈现的那样的纯 ASCII 字符串的可能性非常低。
  • 其实我的方法适用于MD5。看起来我的 sha1 字符串是唯一的问题。有人知道为什么/如何 SHA1 可以包含任何 [^0-9A-F] 字符吗?
  • 可能是因为它是十六进制编码的。使用 UNHEX() 生成二进制 blob。
  • UNHEX 为我的每个“SHA1”字符串返回 NULL。它不起作用,因为 hex-sting 只是 [0-9A-F]+ 而我的字符串是 [0-9A-Z]+ 出于某种原因。
  • 这正是我说你的帖子不可能完全正确的原因。建议的字符串不能是 SHA1 哈希(十六进制或原始),因为长度错误;长度与十六进制的 MD5 匹配,但它不是正确的十六进制。请检查您的假设。你从哪里得到这个字符串?途中是否有可能发生与字符集相关的损坏?

标签: mysql sql postgresql binary


【解决方案1】:

如 cmets 中所述,基本的 SHA1 和 MD5 值是十六进制转义的。这可以通过以下方式轻松转换为 bytea:

 select ('\x' || md5('test'))::bytea;

这需要足够新的 PostgreSQL 版本来支持字节的十六进制编码。

MySQL 可能有一种非常不同的方式来执行此操作,并且考虑到类型之间的不一致,您不能在这里指望跨数据库解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    • 2017-08-04
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多