从字符串中获取唯一数字 - PHP

5

我有一些包含字母数字值的字符串,比如

asdf1234,

qwerty//2345

等等..

我想生成一个特定的常数与该字符串相关联。这个数字不应该与其他字符串生成的任何数字相匹配。


1
数字?整型、浮点型、有符号/无符号?请具体说明。 - AJ.
为什么不对字符串进行哈希处理呢?这样可以为每个字符串提供不同的值。 - gen_Eric
是的,具体来说,我正在寻找一种独特的ID解决方案,我发现数字/整数更方便,我也可以接受哈希。 - Alfred
4个回答

6

需要是数字吗?

您可以简单地对字符串进行哈希处理,这将为您提供一个唯一的值。

echo md5('any string in here');

注意:这是单向哈希,无法从哈希转换回字符串。
这就是密码通常的存储方式(使用此哈希函数或其他哈希函数,通常添加“盐”方法)。检查密码是通过对输入进行哈希并将其与存储的哈希进行比较来完成的。
编辑:md5哈希长度为32个字符。
看看其他哈希函数:
http://us3.php.net/manual/en/function.crc32.php(返回一个数字,可能为负数)
http://us3.php.net/manual/en/function.sha1.php(40个字符)

有没有办法指定哈希长度? - Alfred
使用这个解决方案,它将是32个字符(十六进制数字)。 - kapa
@blasteralfred,我添加了一个链接到crc32()函数,该函数返回一个数字,并澄清了md5和sha-1的哈希长度。 - Fosco

1

你可以使用像md5这样的哈希函数,但那并不是很有趣。

相反,你可以将字符串转换为其ASCII字符序列(因为你说它是字母数字)- 这样,它可以很容易地转换回来,对应于字符串的长度(确切地说是长度*3),它具有0碰撞机会,因为它只是将其转换为另一种表示,总是一个数字,而且更有趣... 例如代码:

function encode($string) {
    $ans = array();
    $string = str_split($string);
    #go through every character, changing it to its ASCII value
    for ($i = 0; $i < count($string); $i++) {

        #ord turns a character into its ASCII values
        $ascii = (string) ord($string[$i]);

        #make sure it's 3 characters long
        if (strlen($ascii) < 3)
            $ascii = '0'.$ascii;
        $ans[] = $ascii;
    }

    #turn it into a string
    return implode('', $ans);
}

function decode($string) {
    $ans = '';
    $string = str_split($string);
    $chars = array();

    #construct the characters by going over the three numbers
    for ($i = 0; $i < count($string); $i+=3)
        $chars[] = $string[$i] . $string[$i+1] . $string[$i+2];

    #chr turns a single integer into its ASCII value
    for ($i = 0; $i < count($chars); $i++)
        $ans .= chr($chars[$i]);

    return $ans;
}

例子:

$original = 'asdf1234';

#will echo
#097115100102049050051052
$encoded = encode($original);
echo $encoded . "\n";

#will echo asdf1234
$decoded = decode($encoded);
echo $decoded . "\n";

echo $original === $decoded; #echoes 1, meaning true

真的很有用..... :) ... 有没有办法将 length*3 更改为 length*2?我是初学者。 - Alfred
@blasteralfred - 这是因为小写字母的ASCII值在100以上,为了方便实现,我在大写字母的ASCII表示之前添加了一个0。我并没有建议这是最优的,只是有点有趣。 - Zirak

0

你正在寻找一个哈希函数,比如md5。你可能想要传递$raw_output=true参数以访问原始字节,然后将它们转换为你想要的数字表示形式。


0

加密哈希函数将为每个输入字符串提供一个不同的数字,但它是一个相当大的数字——例如,在SHA-1的情况下是20字节。原则上,两个字符串可能会产生相同的哈希值,但发生的概率非常小,被认为是可以忽略不计的。

如果您想要一个更小的数字——比如32位整数——那么您不能使用哈希函数,因为碰撞的概率太高了。相反,您需要记录所有已建立的映射。创建一个数据库表,将字符串与数字关联起来,每次给定一个字符串时,在表中查找它。如果在表中找到它,则返回相关的数字。如果没有找到,则选择一个未被任何现有记录使用的新数字,并将新字符串和数字添加到表中。


谢谢...我认为我可以通过将我的字符串元素添加/附加到哈希的前面或后面来修复这个问题。 - Alfred

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接