2011-06-03 57 views
4

我有一个包含字母数字值的一些字符串,说唯一的数字 - PHP

asdf1234

qwerty//2345

等。

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

+1

号码?整数,浮点数,有符号/无符号?请明确点。 – 2011-06-03 14:34:05

+0

为什么不散列这些字符串?这将为每个字符串提供不同的值。 – 2011-06-03 14:35:13

+0

是的,具体而言,我正在寻找一个独特的ID解决方案,我发现号码/整数更方便,ñ我没关系哈希.. – 2011-06-03 14:39:07

回答

4

是否有是多少?

你可以简单地散列字符串,它会给你一个独特的价值。

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个字符)

+0

是否有任何方式来指定哈希长度? – 2011-06-03 14:41:06

+0

@blasteralfred使用此解决方案,它将是32个字符(十六进制数字)。 – kapa 2011-06-03 14:44:00

+0

@blasteralfred我添加了一个链接到crc32()函数,该函数返回一个数字,并澄清md5和sha-1的散列长度。 – Fosco 2011-06-03 14:47:35

0

你正在寻找一个散列函数,如md5。您可能想要传递$ raw_output = true参数以访问原始字节,然后将它们转换为您希望编号输入的任何表示形式。

0

加密散列函数将为您提供每个输入字符串的不同编号,但它是一个相当大的数字 - 例如在SHA-1的情况下为20个字节。原则上,两个字符串可以产生相同的散列值,但发生这种情况的可能性非常小,因此可以忽略不计。

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

+0

谢谢...我想我可以通过添加/附加我的字符​​串元素在散列的后面或前面来解决此问题.. – 2011-06-03 14:48:48

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 
+0

真的很有用..... :) ...有什么方法我可以更改'长度* 3'到'长度* 2'?我是一个初学者.. – 2011-06-04 16:51:53

+0

@blasteralfred - 它的长度* 3,因为小写字母的ASCII值高于100,并且使其易于实现在大写ASCII表示之前附加0。我没有建议它是最佳的,只是有点有趣。 – Zirak 2011-06-04 18:12:14