首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对于sha1来说,BigInt还不够吗?

对于sha1来说,BigInt还不够吗?
EN

Stack Overflow用户
提问于 2017-12-14 01:07:49
回答 3查看 467关注 0票数 0

我想知道BigInt的大小是否足够。我已经创建了一个registration.php,在那里用户会收到一个帐户激活链接的电子邮件,点击来验证他的电子邮件,这样他的帐户就会激活。

帐户激活链接的格式如下:

php

代码语言:javascript
运行
复制
$account_activation_link = 
"http://www.".$site_domain."/".$social_network_name."/activate_account.php?primary_website_email=".$primary_website_email."&account_activation_code=".$account_activation_code."";

/php

帐户激活码的格式如下:

$account_activation_code = sha1( ( STRING ) mt_rand(5,30));//类型在sha1的第一个参数上将INT强制转换为STRING,因为它需要是一个字符串。

现在,通过电子邮件发送了以下链接:http://www.myssite.com/folder/activate_account.php?primary_website_email=my.email@gmail.com&account_activation_code=22d200f8670dbdb3e253a90eee5098477c95c23d

注意sha1生成的账户激活码:22d200f8670db3e253a90eee5098477c95c23d

但是在我的mysql数据库中,在"account_activation_code“列中,我只看到:"22”。其余的激活码丢失了。为什么会这样呢?该列设置为BigInt。这还不足以容纳Sha1生成的代码吗?你的建议是什么?

谢谢

EN

回答 3

Stack Overflow用户

发布于 2017-12-14 01:27:58

SHA-1这样的散列方法产生的二进制值大约是160+位的长度,这取决于所使用的变体。常见的SHA256 one是256位长。64位的BIGINT字段不适合任何加密散列,因为64位的散列很小,除了冲突什么都没有。

通常,人们将散列作为十六进制编码的等价物存储在VARCHAR(255)列中。它们可以被编入索引,并且在大多数情况下都能很好地执行,特别是在根据点击进行定期查找的情况下。从性能和存储的角度来看,这里没有问题。

票数 0
EN

Stack Overflow用户

发布于 2017-12-14 01:28:24

简而言之:BIGINT太小了。

散列基本上是一个位流(在SHA-1的情况下是160位)。虽然可以将这些位呈现为基数为2的数字并将其转换为基数10,但这样做需要非常大的存储空间(据我所知,整数变量大于64位的情况并不常见),而且没有明显的优势。BIGINT是64位类型,因此无法执行此工作。

除非您有充分的理由将其存储为number,否则我会简单地使用binary column type或它在旧的VARCHAR中的纯文本十六进制表示(后者往往更易于处理)。

票数 0
EN

Stack Overflow用户

发布于 2017-12-14 01:10:26

您正在尝试将字符串存储在BigInt中。这就是你的问题。SHA散列是字母数字字符的混合,而不仅仅是数字。将该字段更改为VARCHAR,就可以了

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47798679

复制
相关文章

相似问题

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