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


How to generate a short hash ( a.k.a alphaid ) based on string or array input in one-way?

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

我读了Kevin van Zonneveld关于这个主题的优秀文章,他基于整数生成alphaID,它是双向的。也有很好的SO答案,但我的情况有点不同:

  • 数据库中每个唯一记录有很多(超过 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(( 方法每次都会生成不同的哈希值,而输入不会更改。

是否有任何优雅的选择或良好的编程技术可以在 php 中实现这一目标,同时牢记性能?

你可以尝试像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

对于 base 62 转换,请访问:

将以 10 为底的数字转换为以 62 为底 (a-zA-Z0-9(

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

顺便说一句:使用基本转换,您也可以使 md5 哈希更短:

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