手头有个Asp的函数,由于要转到PHP平台,需要将此函数转换成PHP代码:
期盼高手!我调试过程中发现rnd函数的结果是一定的,请注意这点function mistake(preString)
Dim texts
Dim seed
Dim i,length
Dim lnum, rnum, anum
prestring = trim(preString)
length = len(preString)
seed = length
Randomize(length)
texts = ""
for i = 1 to length
lnum = asc(mid(preString,i,1))
rnum = seed*asc(right(prestring,1))
anum = -lnum-rnum
seed = int(94*rnd(anum)+32)
texts = texts & chr(seed) & chr(int(94*rnd(-seed)+32))
next
dim dist
dist=""
for i = 1 to len(texts)
if mid(texts,i,1)<>"'" then
dist=dist+mid(texts,i,1)
end if
next
mistake = dist
end function
期盼高手!我调试过程中发现rnd函数的结果是一定的,请注意这点function mistake(preString)
Dim texts
Dim seed
Dim i,length
Dim lnum, rnum, anum
prestring = trim(preString)
length = len(preString)
seed = length
Randomize(length)
texts = ""
for i = 1 to length
lnum = asc(mid(preString,i,1))
rnum = seed*asc(right(prestring,1))
anum = -lnum-rnum
seed = int(94*rnd(anum)+32)
texts = texts & chr(seed) & chr(int(94*rnd(-seed)+32))
next
dim dist
dist=""
for i = 1 to len(texts)
if mid(texts,i,1)<>"'" then
dist=dist+mid(texts,i,1)
end if
next
mistake = dist
end function
解决方案 »
- 想做个微博系统。大家说说看,数据库要怎么设计?
- 我要做一个会员积分管理系统!有经验的进来谈谈!
- 请问安装php有什么作用啊?
- php: opendir($path) 如何访问网络路径?
- DOM里的$items->item($i)->nodeValue除了nodeValue还能换什么东西啊?
- select COUNT(*)更快还是COUNT(id)更快?
- 谁给解释一下:smart,adodb,phplib,AppController,Model,Exception
- Cannot send session cookie 这是什么错误啊
- 在php里面也面转向怎么写啊?
- 哪位大侠可以看出来这段字符串是用什么方法加密的?
- 问个乱码问题
- RMB求xls数据格式转成MYSQL数据库格式数据
只要解决问题,马上结贴。
如果能告诉我Asp的Rnd函数的内部实现逻辑,也可以,我自己实现PHP代码。
Asp代码给相同的参数,结果不会变;但是PHP的rand或mt_rand每次都不一样
所以相同参数,但结果却不一样
Rnd[(number)]
number 参数可以是任意有效的数值表达式。说明
Rnd 函数返回一个小于 1 但大于或等于 0 的值。 number 的值决定了 Rnd 生成随机数的方式:
如果 number 为 Rnd 生成
小于零 每次都相同的值,使用 number 作为种子。
大于零 序列中的下一个随机数。
等于零 最近生成的数。
省略 序列中的下一个随机数。
因每一次连续调用 Rnd 函数时都用序列中的前一个数作为下一个数的种子,所以对于任何最初给定的种子都会生成相同的数列。在调用 Rnd 之前,先使用无参数的 Randomize 语句初始化随机数生成器,该生成器具有基于系统计时器的种子。要产生指定范围的随机整数,请使用以下公式: Int((upperbound - lowerbound + 1) * Rnd + lowerbound)这里, upperbound 是此范围的上界,而 lowerbound 是此范围内的下界。
$prestring = trim($prestring);
$length = strlen($preString);
$seed = $length ;
$texts = "";
for( $i=0;$i<=$length;$i++ ) {
$seed = intval(94 * rand( 0,ord(substr($prestring, i, 1)) - $seed * ord(substr($prestring, -1,1))) + 32) ;
// rand( 0,ord(substr($prestring, i, 1) 这个 rand 和你的要求不一样~~他是返回 一到 ord() 中的任何一个数,暂时不知如何解决...
$texts = $texts.chr($seed).chr(intval(94 * rand(0,$seed) + 32)) ; //哎...还是 rand 这!!!
}
$dist = "" ;
for($a=0;$a<=strlen($texts);$a++) {
if( substr($tests,$i,1)!="'" ) {
$dist = $dist.substr($texts, $i, 1);
}
}
$mistake = $dist;
return $mistake;
}
VBS:
Randomize 语句
初始化随机数生成器。Randomize [number]number 参数可以是任何有效的数值表达式。PHP:
void srand ( [int seed] )用 seed 播下随机数发生器种子。从 PHP 4.2.0 版开始,seed 参数变为可选项,当该项为空时,会被设为随时数。
php中rand是两个参数的,min和max,
我又写了一份:
function mistaked($prestr) {
$prestr = trim($prestr);
$length = strlen ($prestr);
$seed = $length;
srand($length);
$texts = "";
for( $i=0;$i<$length;$i++ ) {
$lnum = ord(substr($prestr,$i,1));
$rnum = $seed*ord(substr($prestr,-1));
$anum = -$lnum-$rnum;
echo "$lnum + $rnum : $anum <br/>";
$seed = (int)(94*rand($anum, 0)/$anum+32);
echo $seed ."<br/>";
//$seed = intval(94 * rand( 0,ord(substr($prestr, $i, 1)) - $seed * ord(substr($prestr, -1,1))) + 32) ;
$texts = $texts.chr($seed).chr(intval(94 * rand($seed, 0)/$seed + 32)) ;
}
$dist = "" ;
for($a=0;$a<=strlen($texts);$a++) {
if( substr($tests,$a,1)!="'" ) {
$dist = $dist.substr($texts, $a, 1);
}
}
return $dist;
}
这里调试,显示的结果和Asp还是不一样,哪位高手帮忙给看看
这样还比强行ASP转PHP快,没多少人想看代码改的=_=
我现在的问题是这样的,我们以前的系统是Asp的,上面的函数是密码算法,这个算法是不可逆的;
现在系统要升级为PHP的,数据不能动,所以想用PHP实现上述算法。
现在的问题关键就在这个rand函数上,别的都好模拟,就是这个还没有实现,我也想过查过Asp中Rnd函数的实现机制,没有找到。
苦闷啊!从几位的回复中我也能体会到,很少有人单步调试程序,估计很多人都是走马观花看一眼,觉得代码简单就不看了。(不够认真^_^)继续等待高手中
asp的rnd函数应该vb里面的一样。