首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择十六进制(md5(“任何”)%4;为什么总是为零?

选择十六进制(md5(“任何”)%4;为什么总是为零?
EN

Stack Overflow用户
提问于 2020-01-07 16:16:12
回答 2查看 105关注 0票数 1

为什么mysql中总是零?

代码语言:javascript
复制
select hex(md5("anything"))%4; 

我试过用任何东西代替“任何东西”,但总是零。

预期值为0、1、2或3,但没有如图所示。

我想要(md5sum(“任何”)% 4)。这怎麽可能?

,这是我所需要的最好的答案/解决方案吗?感觉不对

代码语言:javascript
复制
SELECT CONV(SUBSTRING(md5('anything0-10'), 1, 15), 16, 10)%4096;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-07 16:41:15

HEX()返回十六进制数字的字符串,而不是数字。

代码语言:javascript
复制
mysql> select hex(md5("anything"));
+------------------------------------------------------------------+
| hex(md5("anything"))                                             |
+------------------------------------------------------------------+
| 6630653136366463333464313464366332323866666163353736633961343363 |
+------------------------------------------------------------------+

HEX(md5('anything'))返回所有十进制数字。这不是巧合。MySQL的MD5()函数已经返回了一个十六进制编码的字符串(在它上调用HEX()是多余的)。因此,它只返回字符0-9和a:

代码语言:javascript
复制
mysql> select md5('anything');
+----------------------------------+
| md5('anything')                  |
+----------------------------------+
| f0e166dc34d14d6c228ffac576c9a43c |
+----------------------------------+

在此字符串上调用HEX()时,它只返回十六进制值30-39和61-66,编码的ascii值为0-9和a。

这都是为了解释为什么长字符串只包含十进制数字。

在使用% 4的表达式中使用该字符串时,MySQL将在数字上下文中解释该字符串。MySQL将尝试计算字符串的数值,这意味着从字符串中读取前面的十进制数字。

我们还可以使用+0将字符串强制置于数值上下文中。

代码语言:javascript
复制
mysql> select hex(md5('anything'))+0;
+------------------------------------------------------------------+
| hex(md5('anything'))+0                                           |
+------------------------------------------------------------------+
| 6630653136366463000000000000000000000000000000000000000000000000 |
+------------------------------------------------------------------+

64位数字比MySQL整数类型所能表示的要大,因此数值强制必须将其转换为双值。此数据类型为8个字节,仍不足以表示64位数字.因此,它舍入值并忽略较低的数字,将其转换为零。

当然,以一串零结尾的数字可以被4整除,所以模数表达式一定要返回0。

i想要(md5sum(“任何东西”)% 4)。这怎麽可能?

代码语言:javascript
复制
mysql> select conv(right(md5('anything'), 1), 16, 10) % 4 as mod4;
+------+
| mod4 |
+------+
|    0 |
+------+
票数 4
EN

Stack Overflow用户

发布于 2020-01-07 16:41:28

我的猜测如下:

  • hex(md5("anything"))返回一个字符串,
  • %执行隐式强制转换为DOUBLE,
  • 强制转换下降两个低比特后的低位
  • ,每个数字是4

的乘积。

对于%4操作,只有最后一个十六进制数字是相关的,所以您可以:

  • 从MD5 sum
  • 获得最后一个十六进制数字,将其转换为基10
  • ,执行%4操作

代码语言:javascript
复制
SELECT CONV(SUBSTRING(md5('anything'), -1), 16, 10)%4;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59632168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档