木纳 发表于 2008-7-11 10:04:45

有没有crc校验快点的..

在坛子上找了下,只有一个作品,和居士的.
作品里,不提供自定义校验的。
居士那个也太慢了.校验一个文件要1分半钟````

比较郁闷.

[ 本帖最后由 木纳 于 2008-7-16 07:36 编辑 ]

ken0137 发表于 2008-7-11 10:39:31

有个叫fastcrc的,还行

bing614 发表于 2008-7-11 11:53:41

一般都是看文件大小,而定时间长短的,文件小了自然就快了,文件大了肯定要花一定的时间。

木纳 发表于 2008-7-11 22:45:51

我是想用crc来校验下系统文件夹下的一些文件,那里面的没什么特别大的文件.
md5已然靠不住了.
不知道crc能不能支持住


二楼的,能上传一下吗。谢谢

sanhen 发表于 2008-7-12 01:15:02

为什么还要用CRC呢?用sha1岂不是更可靠。。。

kakinkgb 发表于 2008-7-12 15:53:17

你是不是看了 可执行文件的 MD5 碰撞 ?那个我也会做
建议用Sigcheck检查数字签名,而不是算CRC
http://technet.microsoft.com/zh-cn/sysinternals/bb897441(en-us).aspx

sanhen 发表于 2008-7-12 22:06:58

碰撞MD5你成功了?分享下。。。

我可以制作了两个文件大小不同,但是MD5一样。但是经过以上程序处理之后新的MD5码是跟原来两个程序其中任意一个MD5都是不一样的。不知楼上的是否明白。有点绕口令了。

ken0137 发表于 2008-7-13 01:22:55

看着~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Crc32_File.au3

; Created by Yudin Dmitry (Lazycat)

Global $nBufSize = 16384 * 8
Global $CRC32 = 0
Global $sFile = FileOpenDialog("Open file", "", "Any file (*.*)")
If $sFile = "" Then Exit

Global $timer = TimerInit()
Global $hFile = FileOpen($sFile, 16)
For $i = 1 To Ceiling(FileGetSize($sFile) / $nBufSize)
    $CRC32 = FastCRC32(FileRead($hFile, $nBufSize), BitNot($CRC32))
Next
FileClose($hFile)

MsgBox (0, "Result", Hex($CRC32, 8) & " in " & Round(TimerDiff($timer)) & " ms")

Func FastCRC32($vBuffer, $nCRC32 = 0xFFFFFFFF)
    Local $nLen, $vTemp
    If DllStructGetSize($vBuffer) = 0 Then ; String passed
      If IsBinary($vBuffer) Then
            $nLen = BinaryLen($vBuffer)
      Else
            $nLen = StringLen($vBuffer)
      EndIf
      $vTemp = DllStructCreate("byte[" & $nLen & "]")
      DllStructSetData($vTemp, 1, $vBuffer)
      $vBuffer = $vTemp
    EndIf

    ; Machine code hex strings (created by Laszlo)
    Local $CRC32Init = "0x33C06A088BC85AF6C101740AD1E981F12083B8EDEB02D1E94A75EC8B542404890C82403D0001000072D8C3"
    Local $CRC32Exec = "0x558BEC33C039450C7627568B4D080FB60C08334D108B55108B751481E1FF000000C1EA0833148E403B450C89551072DB5E8B4510F7D05DC3"

    ; Create machine code stubs
    Local $CRC32InitCode = DllStructCreate("byte[" & BinaryLen($CRC32Init) & "]")
    DllStructSetData($CRC32InitCode, 1, $CRC32Init)
    Local $CRC32ExecCode = DllStructCreate("byte[" & BinaryLen($CRC32Exec) & "]")
    DllStructSetData($CRC32ExecCode, 1, $CRC32Exec)

    ; Structure for CRC32 Lookup table
    Local $CRC32LookupTable = DllStructCreate("int["& 256 &"]")

    ; CallWindowProc under WinXP can have 0 or 4 parameters only, so pad remain params with zeros
    ; Execute stub for fill lookup table
    DllCall("user32.dll", "int", "CallWindowProc", "ptr", DllStructGetPtr($CRC32InitCode), _
                                                   "ptr", DllStructGetPtr($CRC32LookupTable), _
                                                   "int", 0, _
                                                   "int", 0, _
                                                   "int", 0)
    ; Execute main stub
    Local $ret = DllCall("user32.dll", "uint", "CallWindowProc", "ptr", DllStructGetPtr($CRC32ExecCode), _
                                                               "ptr", DllStructGetPtr($vBuffer), _
                                                               "uint", DllStructGetSize($vBuffer), _
                                                               "uint", $nCRC32, _
                                                               "ptr", DllStructGetPtr($CRC32LookupTable))
    Return $ret
EndFunc

还有一个是生成crc文件+校验的

[ 本帖最后由 ken0137 于 2008-7-13 01:26 编辑 ]

木纳 发表于 2008-7-16 07:35:30

我想试试用几种不同的校验方式一起用.看需要多少时间.
md5的才整到.

多谢谢各位解答!
3q

yarsye 发表于 2010-12-17 10:26:13

好东西 收藏了
页: [1]
查看完整版本: 有没有crc校验快点的..