2014-11-21 157 views
0

喜10位数字,我必须像下面生成字符串

$string = "hello this is big test string" 

$string = "hello small"; 

我需要生成从上面strings.It独特的10个数字的字符串不必是可逆,但总是应该生成相同的唯一10号码。

我的尝试:

function toNumber($dest) 
    { 
     if ($dest) 
      return ord(strtolower($dest)) - 96; 
     else 
      return 0; 
    } 


$str = "hello this is string"; 
$chars = str_split($str); 
foreach($chars as $char){ 
echo toNumber($char) . " "; 
} 

  1. 较小的字符串小于10字符也应产生10个随机数
  2. 我有一个字符串的庞大的数据库,所以数量不宜依赖于第一个或最后10个字符。它应该是所有单词的混合并且尽可能独特。

谢谢大家。

+0

重复从http://stackoverflow.com/questions/3379471/php-number-only-hash – Salketer 2014-11-21 07:33:50

+0

我加入到我的回答一些更多的解释。 – 2014-11-21 09:47:23

回答

0

对您的字符串的MD5一个SUBSTR函数:

substr(hexdec(md5($string)), 0, 10) 
+0

它的小数点后面的数字,我也想稍后增加计数 – 2014-11-21 07:39:08

1

因为英文字母是由26个字母和数字,只拿到10“字母”这是不可能的。
加上你的字符串也可能超过10个字符。
所以没有办法用1到n之间的字符串创建一个只有10位数字的唯一数字。

例如,假设你的字符串是10个字符长的像一个在你的例子:

$string = "hello small"; 


那么你举一个简单的翻译方法:

a = 0, b = 1, c = 2, d = 3, e = 4, f = 5, g = 6, h = 7, i = 8, j = 9, 
k = 0, l = 1, m = 2, n = 3, o = 4, p = 5, q = 6, r = 7, s = 8, t = 9, 
u = 0, v = 1, w = 2, x = 3, y = 4, z = 5, [space] = 6 


则字符串翻译将是:

74114682011 


如果你有另一个字符串,这可能是一些名称...

$string = "robby imull"; 


..它会转换成完全相同的数字代码。

(我知道这是一个陌生的名字,但我只是做了一些快速的例子)

我希望你明白是你的代码限制到10位的理念问题。

+0

你是说SHA1和MD5只是在做不可能的事情吗?碰撞可能发生,但非常罕见。随着他的要求,他们会更频繁地出现,但这不仅仅是不可能... – Salketer 2014-11-21 07:47:06

+0

@Salketer从什么时候sha1或md5限制为10位数? – 2014-11-21 07:48:03

+0

这就是为什么我说会有更多的碰撞,但如果他没有数以万亿的条目,机会会相当低...... – Salketer 2014-11-21 07:50:02

0

这将做

$input = "hello worlds"; 

$encrypted = encryptIt($input); 

function encryptIt($q) { 
    $cryptKey = 'qJB0rGtIn5UB1xG03efyCp'; 
    $qEncoded  = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($cryptKey), $q, MCRYPT_MODE_CBC, md5(md5($cryptKey)))); 
    return($qEncoded); 
} 
echo substr($encrypted, -20, 10); 
+0

这将始终为相同的输入返回一个10位数的相同字符串,并且您可以随时通过更改substr中的值10来增加计数器。希望能帮助到你 !! – 2014-11-21 08:06:42