字符串中的唯一编号 - php

时间:2011-06-03 14:32:51

标签: php

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

asdf1234

qwerty//2345

等..

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

4 个答案:

答案 0 :(得分:6)

它必须是一个数字吗?

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

echo md5('any string in here');

注意:这是一个单向哈希,它不能从哈希转换回字符串。

这是密码通常存储的方式(使用此或其他散列函数,通常添加'salt'方法。)然后通过散列输入并与存储的散列进行比较来检查密码。

编辑:md5哈希长度为32个字符。

看看其他哈希函数:
http://us3.php.net/manual/en/function.crc32.php(返回一个数字,可能是负数)
http://us3.php.net/manual/en/function.sha1.php(40个字符)

答案 1 :(得分: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

答案 2 :(得分:0)

您正在寻找哈希函数,例如md5。您可能希望传递$ raw_output = true参数以获取对原始字节的访问权限,然后将它们转换为您想要该数字的任何表示形式。

答案 3 :(得分:0)

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

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