none
C# 如何比较两个文件内容一样?(也就是内容完全一样,但文件名不一定相同) RRS feed

  • 问题

  • 1 就是如何用程序判别出两张图片文件一模一样?如果一样就返回一个false ,不一样就返回一个true
    (我的图片是一些Excel表格和数据。只比较大小这不行,因为这大小基本是一样,这些表格和数据是很规范的,它们的字节数是差不了多少的)说下思路也行,我比不出来,不知道怎么入手,请大家帮帮我,先谢谢大家了,其实我就是想实现排重功能。

    2  http://www.weather.com.cn/html/weather/101010100.shtml  我在做抓取网页信息入本地数据库时,发现
    那个湿度和风速(这个数值在一张图片)  我提取不到  我怎么做才能取出来呢?(我查看它的源码,它在一个外部JS文件中)
    这正则能取出来吗?要是不用正则那怎么做呢?我都不知怎么入手。。。。。。。。。
    • 已移动 Sheng Jiang 蒋晟Moderator 2009年3月24日 15:51 软件设计问题 (从 Visual C# 移动到 .NET Framework 一般性问题讨论区)
    2009年3月24日 2:24

答案

  • sainaxingxing 说:

    MD5?  没听懂,楼上的朋友能具体点吗?呵呵。



    晕,md5你不会没听说过吧(外星来人?没下载过电影吗),进行二个文件比较,看是否一样,最直接的方法就是二进制比较,md5是二进制比较的一种,会得到一个32位的字符串,如果2个文件即使有再小的差别,得到的md5会完全不一样,所以只要2个文件md5是一样的,2个文件就完全一样。你直接进行二进制比较也可以,这样更麻烦,因为.net里有专门处理md5的类,几行代码就能比较2个文件是否一样,看这里


    更新:2007 年 11 月

    表示 MD5 哈希算法的所有实现均从中继承的抽象类。

    命名空间:  System.Security.Cryptography
    程序集:  mscorlib(在 mscorlib.dll 中)

    语法
    Visual Basic(声明)
    <ComVisibleAttribute(True)> _
    Public MustInherit Class MD5 _
     Inherits HashAlgorithm
     
    Visual Basic (用法)
    Dim instance As MD5
     
    C#
    [ComVisibleAttribute(true)]
    public abstract class MD5 : HashAlgorithm
     
    Visual C++
    [ComVisibleAttribute(true)]
    public ref class MD5 abstract : public HashAlgorithm
     
    J#
    /** @attribute ComVisibleAttribute(true) */
    public abstract class MD5 extends HashAlgorithm
     
    JScript
    public abstract class MD5 extends HashAlgorithm
     

    备注
    哈希函数将任意长度的二进制字符串映射为固定长度的小型二进制字符串。加密哈希函数有这样一个属性:在计算上不大可能找到散列为相同的值的两个不同的输入;也就是说,两组数据的哈希值仅在对应的数据也匹配时才会匹配。数据的少量更改会在哈希值中产生不可预知的大量更改。

    MD5 算法的哈希值大小为 128 位。

    MD5 类的 ComputeHash 方法将哈希作为 16 字节的数组返回。请注意,某些 MD5 实现会生成 32 字符的十六进制格式哈希。若要与此类实现进行互操作,请将 ComputeHash 方法的返回值格式化为十六进制值。

    示例
    下面的代码示例计算字符串的 MD5 哈希值,并将该哈希作为 32 字符的十六进制格式字符串返回。此代码示例中创建的哈希字符串与能创建 32 字符的十六进制格式哈希字符串的任何 MD5 哈希函数(在任何平台上)兼容。

    Visual Basic  复制代码
    Imports System
    Imports System.Security.Cryptography
    Imports System.Text

    Module Example

        ' Hash an input string and return the hash as
        ' a 32 character hexadecimal string.
        Function getMd5Hash(ByVal input As String) As String
            ' Create a new instance of the MD5 object.
            Dim md5Hasher As MD5 = MD5.Create()

            ' Convert the input string to a byte array and compute the hash.
            Dim data As Byte() = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input))

            ' Create a new Stringbuilder to collect the bytes
            ' and create a string.
            Dim sBuilder As New StringBuilder()

            ' Loop through each byte of the hashed data
            ' and format each one as a hexadecimal string.
            Dim i As Integer
            For i = 0 To data.Length - 1
                sBuilder.Append(data(i).ToString("x2"))
            Next i

            ' Return the hexadecimal string.
            Return sBuilder.ToString()

        End Function


        ' Verify a hash against a string.
        Function verifyMd5Hash(ByVal input As String, ByVal hash As String) As Boolean
            ' Hash the input.
            Dim hashOfInput As String = getMd5Hash(input)

            ' Create a StringComparer an comare the hashes.
            Dim comparer As StringComparer = StringComparer.OrdinalIgnoreCase

            If 0 = comparer.Compare(hashOfInput, hash) Then
                Return True
            Else
                Return False
            End If

        End Function



        Sub Main()
            Dim source As String = "Hello World!"

            Dim hash As String = getMd5Hash(source)

            Console.WriteLine("The MD5 hash of " + source + " is: " + hash + ".")

            Console.WriteLine("Verifying the hash...")

            If verifyMd5Hash(source, hash) Then
                Console.WriteLine("The hashes are the same.")
            Else
                Console.WriteLine("The hashes are not same.")
            End If

        End Sub
    End Module
    ' This code example produces the following output:
    '
    ' The MD5 hash of Hello World! is: ed076287532e86365e841e92bfc50d8c.
    ' Verifying the hash...
    ' The hashes are the same.


     
    C#  复制代码
    using System;
    using System.Security.Cryptography;
    using System.Text;

    class Example
    {
        // Hash an input string and return the hash as
        // a 32 character hexadecimal string.
        static string getMd5Hash(string input)
        {
            // Create a new instance of the MD5CryptoServiceProvider object.
            MD5 md5Hasher = MD5.Create();

            // Convert the input string to a byte array and compute the hash.
            byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input));

            // Create a new Stringbuilder to collect the bytes
            // and create a string.
            StringBuilder sBuilder = new StringBuilder();

            // Loop through each byte of the hashed data
            // and format each one as a hexadecimal string.
            for (int i = 0; i < data.Length; i++)
            {
                sBuilder.Append(data[i].ToString("x2"));
            }

            // Return the hexadecimal string.
            return sBuilder.ToString();
        }

        // Verify a hash against a string.
        static bool verifyMd5Hash(string input, string hash)
        {
            // Hash the input.
            string hashOfInput = getMd5Hash(input);

            // Create a StringComparer an comare the hashes.
            StringComparer comparer = StringComparer.OrdinalIgnoreCase;

            if (0 == comparer.Compare(hashOfInput, hash))
            {
                return true;
            }
            else
            {
                return false;
            }
        }


        static void Main()
        {
            string source = "Hello World!";

            string hash = getMd5Hash(source);

            Console.WriteLine("The MD5 hash of " + source + " is: " + hash + ".");

            Console.WriteLine("Verifying the hash...");

            if (verifyMd5Hash(source, hash))
            {
                Console.WriteLine("The hashes are the same.");
            }
            else
            {
                Console.WriteLine("The hashes are not same.");
            }

        }
    }
    // This code example produces the following output:
    //
    // The MD5 hash of Hello World! is: ed076287532e86365e841e92bfc50d8c.
    // Verifying the hash...
    // The hashes are the same.


     

    继承层次结构
    System..::.Object
      System.Security.Cryptography..::.HashAlgorithm
        System.Security.Cryptography..::.MD5
          System.Security.Cryptography..::.MD5Cng
          System.Security.Cryptography..::.MD5CryptoServiceProvider

    线程安全
    此类型的任何公共 static(在 Visual Basic 中为 Shared) 成员都是线程安全的。但不保证所有实例成员都是线程安全的。
    平台
    Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98, Windows CE, Windows Mobile for Smartphone, Windows Mobile for Pocket PC


    .NET Framework 和 .NET Compact Framework 并不是对每个平台的所有版本都提供支持。有关支持的版本的列表,请参见.NET Framework 系统要求。

    版本信息
    .NET Framework
    受以下版本支持:3.5、3.0、2.0、1.1、1.0

    .NET Compact Framework
    受以下版本支持:3.5、2.0

    另请参见
    参考
    MD5 成员
    System.Security.Cryptography 命名空间
    其他资源
    加密服务
     

    2009年3月25日 13:13

全部回复

  • 你好!
         第一个问题:
         可以把图片载入Bitmap,然后选取一些像素点,使用GetPixel方法获取指定像素点的颜色,如果这些选取的点的颜色都一样,就认为图片一样!当然,选取的像素点越多,这个方法越准确啊! 

    周雪峰
    2009年3月24日 4:52
    版主
  • 呵呵。太谢谢了,我取出来了。

    2009年3月24日 5:58
  • 比较像素?嗯 。一个个取再比较,那这种办法比下来两个文件会不会要很长时间?呵呵,谢谢你,我试试吧。
    2009年3月24日 6:00
  • 不用都取啊!你可以想个算法,取一部分点就可以了! 
    周雪峰
    2009年3月24日 6:18
    版主
  • 算法......? 嗯 ,版主能给我个类似这样的算法吗?我还没写出来。呵呵。
    2009年3月24日 8:03
  • 比如说你可以写个循环,每隔几个像素取一个点,这样也许不能100%准确,但是已经足够了,取太多点性能会有损失的,这里有个平衡的问题啊! 
    周雪峰
    2009年3月24日 9:12
    版主
  • 晕,这不很简单吗,比较2个文件是否完全一样用啥,md5不是,把2个图片md5一下,一样就一样,否则就不一样啊
    2009年3月24日 10:18
  • MD5?  没听懂,楼上的朋友能具体点吗?呵呵。
    2009年3月25日 9:39
  • sainaxingxing 说:

    MD5?  没听懂,楼上的朋友能具体点吗?呵呵。



    晕,md5你不会没听说过吧(外星来人?没下载过电影吗),进行二个文件比较,看是否一样,最直接的方法就是二进制比较,md5是二进制比较的一种,会得到一个32位的字符串,如果2个文件即使有再小的差别,得到的md5会完全不一样,所以只要2个文件md5是一样的,2个文件就完全一样。你直接进行二进制比较也可以,这样更麻烦,因为.net里有专门处理md5的类,几行代码就能比较2个文件是否一样,看这里


    更新:2007 年 11 月

    表示 MD5 哈希算法的所有实现均从中继承的抽象类。

    命名空间:  System.Security.Cryptography
    程序集:  mscorlib(在 mscorlib.dll 中)

    语法
    Visual Basic(声明)
    <ComVisibleAttribute(True)> _
    Public MustInherit Class MD5 _
     Inherits HashAlgorithm
     
    Visual Basic (用法)
    Dim instance As MD5
     
    C#
    [ComVisibleAttribute(true)]
    public abstract class MD5 : HashAlgorithm
     
    Visual C++
    [ComVisibleAttribute(true)]
    public ref class MD5 abstract : public HashAlgorithm
     
    J#
    /** @attribute ComVisibleAttribute(true) */
    public abstract class MD5 extends HashAlgorithm
     
    JScript
    public abstract class MD5 extends HashAlgorithm
     

    备注
    哈希函数将任意长度的二进制字符串映射为固定长度的小型二进制字符串。加密哈希函数有这样一个属性:在计算上不大可能找到散列为相同的值的两个不同的输入;也就是说,两组数据的哈希值仅在对应的数据也匹配时才会匹配。数据的少量更改会在哈希值中产生不可预知的大量更改。

    MD5 算法的哈希值大小为 128 位。

    MD5 类的 ComputeHash 方法将哈希作为 16 字节的数组返回。请注意,某些 MD5 实现会生成 32 字符的十六进制格式哈希。若要与此类实现进行互操作,请将 ComputeHash 方法的返回值格式化为十六进制值。

    示例
    下面的代码示例计算字符串的 MD5 哈希值,并将该哈希作为 32 字符的十六进制格式字符串返回。此代码示例中创建的哈希字符串与能创建 32 字符的十六进制格式哈希字符串的任何 MD5 哈希函数(在任何平台上)兼容。

    Visual Basic  复制代码
    Imports System
    Imports System.Security.Cryptography
    Imports System.Text

    Module Example

        ' Hash an input string and return the hash as
        ' a 32 character hexadecimal string.
        Function getMd5Hash(ByVal input As String) As String
            ' Create a new instance of the MD5 object.
            Dim md5Hasher As MD5 = MD5.Create()

            ' Convert the input string to a byte array and compute the hash.
            Dim data As Byte() = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input))

            ' Create a new Stringbuilder to collect the bytes
            ' and create a string.
            Dim sBuilder As New StringBuilder()

            ' Loop through each byte of the hashed data
            ' and format each one as a hexadecimal string.
            Dim i As Integer
            For i = 0 To data.Length - 1
                sBuilder.Append(data(i).ToString("x2"))
            Next i

            ' Return the hexadecimal string.
            Return sBuilder.ToString()

        End Function


        ' Verify a hash against a string.
        Function verifyMd5Hash(ByVal input As String, ByVal hash As String) As Boolean
            ' Hash the input.
            Dim hashOfInput As String = getMd5Hash(input)

            ' Create a StringComparer an comare the hashes.
            Dim comparer As StringComparer = StringComparer.OrdinalIgnoreCase

            If 0 = comparer.Compare(hashOfInput, hash) Then
                Return True
            Else
                Return False
            End If

        End Function



        Sub Main()
            Dim source As String = "Hello World!"

            Dim hash As String = getMd5Hash(source)

            Console.WriteLine("The MD5 hash of " + source + " is: " + hash + ".")

            Console.WriteLine("Verifying the hash...")

            If verifyMd5Hash(source, hash) Then
                Console.WriteLine("The hashes are the same.")
            Else
                Console.WriteLine("The hashes are not same.")
            End If

        End Sub
    End Module
    ' This code example produces the following output:
    '
    ' The MD5 hash of Hello World! is: ed076287532e86365e841e92bfc50d8c.
    ' Verifying the hash...
    ' The hashes are the same.


     
    C#  复制代码
    using System;
    using System.Security.Cryptography;
    using System.Text;

    class Example
    {
        // Hash an input string and return the hash as
        // a 32 character hexadecimal string.
        static string getMd5Hash(string input)
        {
            // Create a new instance of the MD5CryptoServiceProvider object.
            MD5 md5Hasher = MD5.Create();

            // Convert the input string to a byte array and compute the hash.
            byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input));

            // Create a new Stringbuilder to collect the bytes
            // and create a string.
            StringBuilder sBuilder = new StringBuilder();

            // Loop through each byte of the hashed data
            // and format each one as a hexadecimal string.
            for (int i = 0; i < data.Length; i++)
            {
                sBuilder.Append(data[i].ToString("x2"));
            }

            // Return the hexadecimal string.
            return sBuilder.ToString();
        }

        // Verify a hash against a string.
        static bool verifyMd5Hash(string input, string hash)
        {
            // Hash the input.
            string hashOfInput = getMd5Hash(input);

            // Create a StringComparer an comare the hashes.
            StringComparer comparer = StringComparer.OrdinalIgnoreCase;

            if (0 == comparer.Compare(hashOfInput, hash))
            {
                return true;
            }
            else
            {
                return false;
            }
        }


        static void Main()
        {
            string source = "Hello World!";

            string hash = getMd5Hash(source);

            Console.WriteLine("The MD5 hash of " + source + " is: " + hash + ".");

            Console.WriteLine("Verifying the hash...");

            if (verifyMd5Hash(source, hash))
            {
                Console.WriteLine("The hashes are the same.");
            }
            else
            {
                Console.WriteLine("The hashes are not same.");
            }

        }
    }
    // This code example produces the following output:
    //
    // The MD5 hash of Hello World! is: ed076287532e86365e841e92bfc50d8c.
    // Verifying the hash...
    // The hashes are the same.


     

    继承层次结构
    System..::.Object
      System.Security.Cryptography..::.HashAlgorithm
        System.Security.Cryptography..::.MD5
          System.Security.Cryptography..::.MD5Cng
          System.Security.Cryptography..::.MD5CryptoServiceProvider

    线程安全
    此类型的任何公共 static(在 Visual Basic 中为 Shared) 成员都是线程安全的。但不保证所有实例成员都是线程安全的。
    平台
    Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98, Windows CE, Windows Mobile for Smartphone, Windows Mobile for Pocket PC


    .NET Framework 和 .NET Compact Framework 并不是对每个平台的所有版本都提供支持。有关支持的版本的列表,请参见.NET Framework 系统要求。

    版本信息
    .NET Framework
    受以下版本支持:3.5、3.0、2.0、1.1、1.0

    .NET Compact Framework
    受以下版本支持:3.5、2.0

    另请参见
    参考
    MD5 成员
    System.Security.Cryptography 命名空间
    其他资源
    加密服务
     

    2009年3月25日 13:13
  • 谢谢楼上的朋友。我明白了,呵呵。
    2009年3月26日 6:04