我想知道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,因为它需要是一个STRING。
请注意sha1生成的帐户激活码: 22d200f8670dbdb3e253a90eee5098477c95c23d
但是在我的mysql数据库中,在“account_activation_code”列中,我只看到: “22”。其余的激活码丢失了。这是为什么 ? 该列设置为BigInt。是不是足以容纳Sha1生成的代码? 你的建议是什么?
谢谢
答案 0 :(得分:0)
像SHA-1这样的散列方法产生的二进制值大约为160+位,具体取决于所使用的变体。常见的SHA256长256位。没有加密哈希值适合64位BIGINT字段,因为64位哈希值很小,除了冲突之外你什么也没有。
通常人们将哈希值存储为VARCHAR(255)
列中的十六进制编码等效值。在大多数情况下,这些索引可以编制索引并且运行良好,尤其是在您根据点击进行定期查找的情况下。从性能和存储的角度来看,这里没有问题。
答案 1 :(得分:0)
简短回答:BIGINT
太小了。
散列基本上是比特流(在SHA-1的情况下为160比特)。虽然将这些位作为基数2转换并将其转换为基数10当然是可能的,但是你需要一个非常大的存储空间(据我所知,看到整数变量并不常见)大于64位)并没有明显的优势。 BIGINT是64位类型,因此无法完成工作。
除非你有充分的理由将其存储为数字,否则我只需要在一个好的VARCHAR
中使用binary column type或其纯文本十六进制表示(后者倾向于更实际地处理)。
答案 2 :(得分:-1)
您正在尝试将字符串存储在BigInt中。那是你的问题。 SHA哈希是字母数字字符的混合,而不仅仅是数字。将字段更改为VARCHAR,您就可以了