ASP/VBScript 利用.NET Framework实现PHP sha1() md5()

其实.NET Framework的一些库,ASP是可以直接借来用的,这点我在《ASP/VBScript访问并使用.NET Framework对象》文中已经做了简单的说明,今天正好又遇到一个借用.NET Framework实现某个特殊功能的例子。

在PHP中要计算文本的SHA-1其实很容易,直接使用sha1()这个函数就能轻松搞定了,但是在ASP中就杯具了,没有现成的函数,只能靠手写代码,包括md5()这些常用的哈希函数都要自己编码,好在已经有大牛帮我们写好代码了,我们只需要直接捡现成的用就可以了,比如说MD5就已经有不错的ASP/VBScript版本,关于不同语言的MD5实现可以参考在这里。好了,下面谈下比较棘手的SHA-1算法吧,你肯定说这个也有现成的ASP代码,是的,而且国内著名的ASP博客程序PJ-Blog已经内置了这种SHA-1算法了,那有什么好纠结的呢?PJ的SHA-1代码源于这里,这个实现代码其实是JavaScript版本的,因为IIS的ASP技术默认支持VBScript和JavaScript/JScript两种脚本语言,所以我们可以直接拿来和VBScript混合使用。似乎这样也没有什么问题,但是对于ASP这种古老的技术而言,性能一直是其最大的瓶颈,而ASP性能建议上提到,不要混用两种脚本语言,也就是说混用VBScript和JScript会导致服务器缓存两个脚本解释引擎,而且会导致上下文切换的开销,所以性能上就有所损耗了,由于初始配置的IIS是把VBScript作为默认脚本语言,再加上JScript的对象模型,所以和JScript比起来VBScript可能性能上要好一点。

好吧,下面我们要做的是搞个VBScript版本的SHA-1,在这里我偷懒了点,求助了万能的谷歌,然后找到了一篇文章《Replicating PHP’s sha1() in VBScript》,其中就提到了,借用.NET Framework的技术实现了VBScript版本的sha1,由于是通过Server.CreateObject实现的,所以代码比较简洁,性能上也应该说得过去,在这里我改写成类似PHP的sha1()函数:

继续阅读

ASP/VBScript访问并使用.NET Framework对象

我这里要说的是ASP,没错,不是ASP.NET,我们所要做的是如何让ASP像ASP.NET那样访问.NET Framework的内置对象,首先我们需要安装.NET Framework环境,然后下一步呢?CreateObject创建对象?答对了一半,不过有一点要让你失望了,那就是大多数.NET Framework类对于ASP是无法访问的,别急,仍然有大量.NET 类实现了可调用 COM 接口,也就是说,我们可以像创建普通COM对象那样创建它们。

在具体操作前,不妨打开我们的注册表,定位到HKEY_CLASSES_ROOT,然后你就会发现有大量的.NET类的ProgId和CLSID,这样我们就可以通过这些特征信息来创建并使用这些对象。

注册表中.NET对象的COM接口.png

Microsoft TechNet的《您好,脚本专家!》栏目中介绍了如何在WScript脚本宿主中调用这些对象,比如System.Collections.ArrayList,我们现在可以除了Scripting.Dictionary外有了更多的选择,其中ArrayList的Sort排序等功能更是我们所垂涎的,比如脚本专家上的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Set DataList = CreateObject _
      ("System.Collections.ArrayList")
 
DataList.Add "B"
DataList.Add "C"
DataList.Add "E"
DataList.Add "D"
DataList.Add "A"
 
DataList.Sort()
 
For Each strItem in DataList
    Wscript.Echo strItem
Next
Set DataList = Nothing

我们可以很容易的就将其改成ASP版本的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<%
Set DataList = Server.CreateObject _
      ("System.Collections.ArrayList")
 
DataList.Add "B"
DataList.Add "C"
DataList.Add "E"
DataList.Add "D"
DataList.Add "A"
 
DataList.Sort()
 
For Each strItem in DataList
    Response.Write strItem
Next
 
Set DataList = Nothing
%>

经过测试这样是可行的,怎么样,是不是很方便,关于ArrayList更多的使用方法可以参考MSDN的.NET Framework手册了,这样我们写ASP程序又多了一种更为强大的选择,不过我还是奉劝还在搞鼓ASP的程序员,该换换口味了,为何不试试更为强大的ASP.NET或者PHP呢?

参考文档《.NET COM+ Interop Component with Classic ASP》