【问题标题】:Generate 10 digit number from a string从字符串生成 10 位数字
【发布时间】:2014-11-21 07:29:00
【问题描述】:

嗨,我有如下字符串

$string = "hello this is big test string"

或

$string = "hello small";

我需要从上面的字符串中生成唯一的 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 个字符。它应该是所有单词的混合,并且尽可能唯一。

谢谢大家。

【问题讨论】:

标签: php string


【解决方案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 位数的想法有什么问题。

【讨论】:

  • 你是说 SHA1 和 md5 只是在做不可能的事吗?可能会发生碰撞,但非常罕见。按照他的要求,它们会更频繁地发生,但这并不是完全不可能的......
  • @Salketer 从什么时候开始 sha1 或 md5 限​​制为 10 位数字?
  • 这就是为什么我说会有更多的碰撞,但如果他没有数万亿的条目,机会就会相当低......
  • @Salketer 好吧,如果您为字符串生成唯一 ID 之类的东西,那么机会相当低 - 但如果您想根据字符生成数字,机会就很高。
【解决方案2】:

在你的字符串的 md5 上创建一个 substr 函数:

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

【讨论】:

  • 它带有一些小数,我也希望以后增加计数
【解决方案3】:

这样就可以了

$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);

【讨论】:

  • 这将始终为相同的输入返回一个 10 位数的相同字符串,您可以随时通过更改 substr 中的值 10 来增加计数器。希望有帮助!!
猜你喜欢
  • 2011-09-09
  • 1970-01-01
  • 2014-07-05
  • 2012-08-16
  • 1970-01-01
  • 2022-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多