gpt4 book ai didi

php - 如何基于单向输入的字符串或数组生成短散列(又名 alphaid)?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:28:35 25 4
gpt4 key购买 nike

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

我读了 Kevin van Zonneveld 的 excellent article关于这个主题,他基于整数生成 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

  • Sets 在同一 ID 下没有超过 ~120K 左右的 sibling 。
  • 我可以轻松地将这个数组转换为 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

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

base62 = b3Vsi

对于 base 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

关于php - 如何基于单向输入的字符串或数组生成短散列(又名 alphaid)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20275270/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com