我想知道BigInt的大小是否足够。我已经创建了一个registration.php,在那里用户会收到一个帐户激活链接的电子邮件,点击来验证他的电子邮件,这样他的帐户就会激活。
帐户激活链接的格式如下:
php
$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生成的代码吗?你的建议是什么?
谢谢
发布于 2017-12-14 01:27:58
像SHA-1这样的散列方法产生的二进制值大约是160+位的长度,这取决于所使用的变体。常见的SHA256 one是256位长。64位的BIGINT字段不适合任何加密散列,因为64位的散列很小,除了冲突什么都没有。
通常,人们将散列作为十六进制编码的等价物存储在VARCHAR(255)
列中。它们可以被编入索引,并且在大多数情况下都能很好地执行,特别是在根据点击进行定期查找的情况下。从性能和存储的角度来看,这里没有问题。
发布于 2017-12-14 01:28:24
简而言之:BIGINT
太小了。
散列基本上是一个位流(在SHA-1的情况下是160位)。虽然可以将这些位呈现为基数为2的数字并将其转换为基数10,但这样做需要非常大的存储空间(据我所知,整数变量大于64位的情况并不常见),而且没有明显的优势。BIGINT是64位类型,因此无法执行此工作。
除非您有充分的理由将其存储为number,否则我会简单地使用binary column type或它在旧的VARCHAR
中的纯文本十六进制表示(后者往往更易于处理)。
发布于 2017-12-14 01:10:26
您正在尝试将字符串存储在BigInt中。这就是你的问题。SHA散列是字母数字字符的混合,而不仅仅是数字。将该字段更改为VARCHAR,就可以了
https://stackoverflow.com/questions/47798679
复制相似问题