Same Hash For Two Different List ? Why ? How to solve

Why two different value of list generating hashcode. i am trying to detect any changes done in a list , if yes it will get deleted. i couldnt do at my work place so this is just a simple code of generating hash.

 `public List<bool> list1 = new List<bool> { true, false, false };
     public List<bool> list2 = new List<bool> { true, true, false };
     // Use this for initialization
     void Start () {
 
         Debug.Log (list1);
         Debug.Log (list2);
 
 
         string a = list1.ToString ();
         string b = list2.ToString ();
 
 
         Debug.Log ("Generating Hash Codes");
         Debug.Log(HashString (a));
         Debug.Log(HashString (b));
     }
     
 
 
     public string HashString(string data){
         SHA1CryptoServiceProvider cyrpt = new SHA1CryptoServiceProvider();
         // hash string 
         string hash = string.Empty;
         //computing hash
         byte[] cyrpto = cyrpt.ComputeHash (System.Text.Encoding.UTF8.GetBytes(data),
             0,
             System.Text.Encoding.UTF8.GetByteCount(data));
         //convert to hex
         foreach (byte bit in cyrpto) {
             hash += bit.ToString("x2");
 
         }
         return hash.ToString();    
     }`

Because ToString of the List class just returns the class name as this is the default behaviour for any class that does not explicitly override the ToString method. So since both lists have the same type the returned string is of course the same.

From your code it’s hard to tell what you actually want to achieve. If you want to compare the content of the two lists you actually have to iterate through all elements. A generic list can contain any kind of data. There is no way to turn the content of the whole list into a string in a generic manner. You can use the Aggregate Linq extension to convert your list content into a string. In your case something like this would work:

string a = list1.Aggregate(new StringBuilder(), (sb, v)=>sb.Append(v).Append(" ")).ToString();

To use Aggregate you have to add using System.Linq; and to use the StringBuilder you have to add using System.Text;at the top.

Now “a” should contain a string like "true false false "