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

edi*_*igu 2 php arrays encryption algorithm hash

我正在尝试生成像我的应用程序中使用的youtube视频ID的短字符串哈希,但我无法弄清楚什么是最快和最简单的方法,同时使用数组或基于json的字符串提供最短的哈希.

我读了Kevin van Zonneveld 关于这个主题的优秀文章,他根据整数生成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));
    
    // ...
    
    Run Code Online (Sandbox Code Playgroud)
  • 我试图生成唯一的(但短)散列为每一套像1:aeF4t,2:eaXvT,3:t4fa.
  • 同一id下的唯一性很重要.例如:

    1:aeF4t并且2:aeF4t没关系,但我不想在相同的唯一ID下使用相同的哈希值: 1:aeF4t1:aeF4t.

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

是否有任何优雅的选项或良好的编程技术来实现PHP中的性能同时保持性能?

bit*_*ing 9

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

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

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

echo base_convert($crc32, 10, 36); // 9205is
Run Code Online (Sandbox Code Playgroud)

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

base62 = b3Vsi
Run Code Online (Sandbox Code Playgroud)

对于基地62转换访问:

将数字基数10转换为基数62(a-zA-Z0-9)

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

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

md5 (base 16) = de07bf84ad7708b93eca60b608c7b6e2
md5 (base 62) = 6KXPVjy4V22IgMsCKo86IQ
Run Code Online (Sandbox Code Playgroud)