php:仅数字哈希?

2022-08-30 10:28:39

在php中,有没有办法从字符串中给出唯一的哈希值,但是哈希值仅由数字组成?

例:

return md5(234); // returns 098f6bcd4621d373cade4e832627b4f6

但我需要

return numhash(234); // returns 00978902923102372190 
(20 numbers only)

这里的问题是我希望哈希是短的。

编辑:好吧,让我在这里解释一下背景故事。我有一个网站,每个注册的人都有一个ID,我还需要一个ID供该人使用和交换(因此它不能太长),到目前为止,ID编号一直是00001,00002,00003等...

  1. 这让一些人看起来更重要
  2. 这揭示了我不想透露的应用程序信息。

要修复点1和2,我需要“隐藏”数字,同时保持其唯一性。

编辑 + 解决方案:

基于 https://stackoverflow.com/a/23679870/175071 代码的数字哈希函数

/**
 * Return a number only hash
 * https://stackoverflow.com/a/23679870/175071
 * @param $str
 * @param null $len
 * @return number
 */
public function numHash($str, $len=null)
{
    $binhash = md5($str, true);
    $numhash = unpack('N2', $binhash);
    $hash = $numhash[1] . $numhash[2];
    if($len && is_int($len)) {
        $hash = substr($hash, 0, $len);
    }
    return $hash;
}

// Usage
numHash(234, 20); // always returns 6814430791721596451

答案 1

PHP 中的 MD5 或 SHA1 哈希返回一个十六进制数,因此您需要做的就是转换基数。PHP有一个函数可以为您做到这一点:

$bignum = hexdec( md5("test") );

$bignum = hexdec( sha1("test") );

PHP 手册 for hexdec

由于您需要一个有限的大小编号,因此可以使用模块化除法将其放在所需的范围内。

$smallnum = $bignum % [put your upper bound here]

编辑

正如Artefacto在注释中指出的那样,使用这种方法将导致一个数字超过PHP中整数的最大大小,并且模块化除法后的结果将始终为0。但是,获取包含前 16 个字符的哈希的子字符串不会出现此问题。用于计算初始大数的修订版:

$bignum = hexdec( substr(sha1("test"), 0, 15) );

答案 2

您可以尝试 。请参阅以下位置的文档:http://php.net/manual/en/function.crc32.phpcrc32()

$checksum = crc32("The quick brown fox jumped over the lazy dog.");
printf("%u\n", $checksum); // prints 2191738434 

话虽如此,应该用于.crcvalidate the integrity of data


推荐