在PHP中创建短哈希

时间:2011-12-04 16:24:48

标签: php hash

这里有很多次询问过SO。但我没有找到解决问题的方法。

我想为邀请系统创建一个短哈希(假设最多8个字符)。我无法使用base[X] encoding,因为这太容易猜到了。我不能修剪额外的字符,例如一个MD5哈希值,因为我认为碰撞问题会在某个时候出现。

有解决方法吗?

3 个答案:

答案 0 :(得分:2)

如果您想确保永远不会发生冲突,最好的办法是维护一个有效哈希数据库,并在生成新哈希值时与该数据库进行比较。

如果您认为自己的音量较高,则可能需要预先生成哈希值,以便您可以使用它们的“干草堆”。有些人使用随机数进行此操作,因为硬件随机数生成器只能以特定速率生成数字。

答案 1 :(得分:0)

您可以在SHA1或MD5上使用substr。与substr'd散列冲突的可能性与设计为较短长度的散列相同。

或者如果你真正想要的是生成一个唯一的密钥,你可以这样做:

define('KEY_CHARS', 'acefghjkpqrstwxyz23456789'); // characters which cannot be confused phonetically or by bad handwriting

function generateKey($len = 8) {
    $k = str_repeat('.', $len);
    while ($len--) {
        $k[$len] = substr(KEY_CHARS, mt_rand(0, strlen(KEY_CHARS) - 1), 1);
    }
    return $k;
}

答案 2 :(得分:0)

最短的有用散列算法是md5。 Md5生成16个字节= 128位散列。 如果使用base 64编码,即每个字节/ char有6个有用位。

你应该能够将md5减少到22个字符(留下b64引入的尾随填充)。

这对于合法文件名使用相同的附加优势。您必须将默认的/和+字符替换为不与您的操作系统的文件命名约定冲突的任何其他符号。

Base64(通过替换/和+)确保您的哈希不会弄乱具有特殊字符的网址。