如何基于单向字符串或数组输入生成短哈希(a.k.a alphaid)?

时间:2013-11-28 21:53:46

标签: php arrays algorithm encryption hash

我尝试生成短片串哈希,例如youtube视频ID,以便在我的应用中使用但我无法弄清楚什么是最快最简单的方法,同时使用数组提供最短哈希或基于json的字符串。

我读过Kevin van Zonneveld关于这个主题的excellent article,他根据整数生成alphaID,它有两种方式。还有很好的答案,但我的情况有点不同:

  • 数据库中的每个唯一记录都有很多(超过100K)但很小的数据集(数组):

    $id = 1;
    $set[$id] = array(533 => array('a' => 78), 460 => array('a' => 89));
    $set[$id] = array(534 => array('b' => 79), 620 => array('a' => 908));
    $set[$id] = array(535 => array('a' => 80), 782 => array('c' => 901));
    
    $id = 2;
    $set[$id] = array(672 => array('a' => 12), 852 => array('a' => 122));
    $set[$id] = array(542 => array('a' => 67), 372 => array('a' => 831));
    $set[$id] = array(573 => array('a' => 77), 853 => array('a' => 127));
    
    // ...
    
  • 我尝试为1:aeF4t2:eaXvT3:t4fa等每个集合生成唯一(但很短)的哈希值。
  • 相同ID下的唯一性很重要。例如:

    1:aeF4t2:aeF4t没问题,但我不想在相同的唯一ID下使用相同的哈希值: 1:aeF4t1:aeF4t

  • 在相同的ID下,集合的兄弟姐妹不会超过~120K左右。
  • 我可以轻松地将此数组转换为json字符串。
  • 单向生成哈希对我来说已经足够了。我以后不需要解码以前生成的哈希值。
  • 当我稍后提供相同的数据集时,哈希方法应该生成相同的哈希。因此,使用日期或基于微量滴定值的盐腌不是很好的选择。
  • 我认为md5()sha1()是桌面上最快的选项,但它们会产生太长的值。我正在寻找一种缩短哈希总长度的方法。
  • 内置uniqid()方法,每次输入不变时都会生成不同的哈希值。

在保持性能的同时,有没有优雅的选项或良好的编程技术来实现这一点?

1 个答案:

答案 0 :(得分:7)

您可以尝试像crc32这样的校验和功能。我不确定你是否会遇到冲突(不同阵列的校验和相同),但概率应该非常低。

$array = array(533 => array('a' => 78), 460 => array('a' => 89));
$crc32 = sprintf('%u', crc32(serialize($array)));
echo $crc32; // 547561972

使用基本转换,您可以缩短此整数:

echo base_convert($crc32, 10, 36); // 9205is

如果您转换为基础62,您可以进一步缩短它:

base62 = b3Vsi

对于基地62转换访问:

converting a number base 10 to base 62 (a-zA-Z0-9)

http://marcus.bointon.com/php-base-62-encoding/

顺便说一下:使用基本转换,你也可以缩短md5哈希值:

md5 (base 16) = de07bf84ad7708b93eca60b608c7b6e2
md5 (base 62) = 6KXPVjy4V22IgMsCKo86IQ