【问题标题】:shortest possible hash value最短的哈希值
【发布时间】:2012-06-15 17:08:15
【问题描述】:

我已经浏览了这个页面...

http://www.php.net/manual/en/function.hash.php

MD5 为 32 个字符,而 sha1 为 40。 例如

$str = 'apple';

sha1 string d0be2dc421be4fcd0172e5afceea3970e2f3d940
md5 string 1f3870be274f6c49b3e31a0c6728957f

即使可选的 raw_output 设置为 TRUE,md5 摘要也会以长度为 16 的原始二进制格式返回。

我正在寻找一个可以创建等于或小于 8 个字符的哈希的函数。

更新: 我需要更小的字符串有 3 个原因:

1) MySQL 存档表类型似乎不允许在超过 8 个字符的列上建立索引

2) 我打算使用像 redis 这样喜欢较小键的键值实用程序

3) 安全性在这里不是问题。我正在散列“国家+电信+运营商”之类的列

【问题讨论】:

  • 嗯,要么你需要很多位(用于许多信息),要么你不需要。如果是后者,那么为什么不将哈希字符串截断到所需的长度呢?只要您始终以相同的方式进行操作,结果也应该相同(对于相同的输入)。但请记住,更少的比特会导致更高的冲突概率。
  • 你需要这个做什么?我几乎不假设您想要生成临时密码,但请记住,哈希仅包含 16 个不同的字符。密码少了。
  • 你应该添加更多解释为什么你希望创建一个只有 8 个字符的哈希。这是非常脆弱的。我担心你可能会犯一个大错误,这会在你醒来时跟随你并从内部诅咒你的项目。
  • @shantanuo:你也看到this

标签: php


【解决方案1】:

您可以使用crc32 方法创建哈希,它会创建一个 8 字符长的哈希。

$hash = hash('crc32', $input, FALSE);

非常谨慎使用此方法,因为它完全暴露在密码攻击之下。 不要将其用于任何类型的安全检查。

【讨论】:

  • 确实如此。感谢您指出我忘记在答案中添加通知。我希望提问者在他/她希望使用该方法的地方修改他/她的问题。
【解决方案2】:

留给我,我建议您创建自己的自定义“加密”算法,为您生成 8 个字符。例如,您甚至可以决定执行 md5、SHA1 和 SHA512,并以 2:3:3 的比例组合以获得您自己的自定义代码。

【讨论】:

  • 虽然这似乎是个好主意,但最好不要自作聪明。通过组合多个部分哈希,您可能会生成一个不安全的哈希。
  • 嗯,虽然@fotanus 并没有在“安全”哈希的上下文中发布此内容,但现在回想起来,我意识到,这将是对硬件资源的愚蠢浪费。最近 murmurHash 特别是 crc 的一个很好的替代品,可能还有 xxHash。
【解决方案3】:
function short_hash($value, $length=8) {
    return substr(md5($value), 0, $length);
}

【讨论】:

  • 小心碰撞!不要将其用于任何与安全相关的哈希。
猜你喜欢
  • 2017-02-16
  • 2010-10-20
  • 2013-05-01
  • 2014-03-19
  • 1970-01-01
  • 1970-01-01
  • 2010-10-31
  • 2010-11-21
  • 1970-01-01
相关资源
最近更新 更多