这里有很多次询问过SO。但我没有找到解决问题的方法。
我想为邀请系统创建一个短哈希(假设最多8个字符)。我无法使用base[X] encoding
,因为这太容易猜到了。我不能修剪额外的字符,例如一个MD5
哈希值,因为我认为碰撞问题会在某个时候出现。
有解决方法吗?
答案 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(通过替换/和+)确保您的哈希不会弄乱具有特殊字符的网址。