【问题标题】:Is Not BigInt Enough To House sha1?BigInt 不足以容纳 sha1 吗?
【发布时间】:2017-12-13 17:07:48
【问题描述】:

我想知道 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)); //Type 在sha1的第一个参数上将INT转换为STRING,因为它需要是一个字符串。

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

注意 sha1 生成的帐户激活码: 22d200f8670dbdb3e253a90eee5098477c95c23d

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

谢谢

【问题讨论】:

  • IIRC,MySQL 的 BigInt — 64 位长,但 SHA1 是 160 位长。
  • @PetSerAl SHA1 也是一个字符串,而不是一个整数
  • @watzon 这取决于您如何表示它。完全有可能将哈希值表示为单个数字,因为您有一个类型来表示那个大数字。 MySQL 的 BigInt 不够大。
  • @PetSerAl 只是让 BigInt 更大是行不通的,也不能真正解决他的根本问题。为了使 SHA1 散列成为整数,您必须转换基数。只需更改为 VARCHAR 即可解决更大的问题
  • @watzon SHA1 是二进制的。人们只是习惯于看到它的“十六进制编码”转储,因为它更容易阅读。

标签: mysql sha1 bigint


【解决方案1】:

SHA-1 这样的散列方法会产生大约 160+ 位长的二进制值,具体取决于所使用的变体。常见的 SHA256 是 256 位长。没有加密散列适合 64 位 BIGINT 字段,因为 64 位散列太小了,只会发生冲突。

通常人们将哈希作为十六进制编码的等价物存储在VARCHAR(255) 列中。在大多数情况下,这些可以被索引并表现得足够好,尤其是在您根据点击进行定期查找的情况下。从性能和存储的角度来看,这里没有问题。

【讨论】:

    【解决方案2】:

    简答:BIGINT 太小了。

    哈希基本上是一个比特流(SHA-1 的情况下为 160 比特)。虽然当然可以将这些位渲染为以 2 为底的数字并将其转换为以 10 为底的数字,但您需要一个非常大的存储空间(据我所知,看到大于 64 位的整数变量并不常见)并且有优势不明显。 BIGINT 是 64 位类型,因此无法胜任。

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

    【讨论】:

    • 请不要成为您团队中将哈希作为原始二进制文件存储在数据库中的人。这令人难以置信的烦人,因为您无法剪切粘贴这些值来进行临时查询,并且检查它们需要大量额外的工作。节省的空间是如此微不足道,除非您处理数以万亿计的这些事情,否则您永远不会注意到。
    • @tadman 你是对的。我不想推荐二进制而不是文本,我只是想强调哈希的二进制性质。我会努力改进措辞。
    【解决方案3】:

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

    【讨论】:

    • Watz,好的,谢谢。我会尝试。但是,我应该在这里为 VarChar 设置多少位数?我可以在这个例子中看到 40 位数字,但我不确定它是否总是最多 40 位数字。
    • @PhpLearner SHA1 哈希长度为 40 个字符
    • 干杯。然后将限制设置为 40 位。
    • 它们不是“字母数字字符”的混合。您只是习惯于看到其中包含 0-9 和 a-f 的十六进制转储版本。 Base-64 使用的字符范围更广,但这种编码方法通常不用于哈希。
    • @PhpLearner 你把它改成了 VARCHAR(40)?除非您将字符串转换为沿线某处的 int,否则我想不出它无法工作的任何原因
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多