Иногда при разработке игрового приложения возникает необходимость в проверке целостности файлов. В моем конкретном случае Фиши требовали писать сохраненки в XML и к файлам было полное рукоприкладство со стороны QA. Небольшой класс дает нам возможность проверить ковырялся ли кто в наших файлах или нет. Обошелся без бородатой сериализации. На изменение межстрочного расстояния между дескрипторами логика глаза закрывает(нам оно по сути не важно, это не делает файл непригодным). Реализация удобная для меня. Может где лишнюю бороду и прикрутил, до этого с XML мало сталкивался.
public class Security : MonoBehaviour
{
public TextAsset XMLSaveData;
private XmlTextReader readerXML;
byte[] HashValue;
private UnicodeEncoding UE;
private string newHash;
private byte[] SentHashValue;
void Start()
{
ResultHashCompare();
}
bool ResultHashCompare() // Если хэши не равны, возвращаем false
{
if (XMLSaveData == null)
{
return false;
}
bool result=false;
newHash = "";
readerXML = new XmlTextReader(new StringReader(XMLSaveData.text));
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load(readerXML);
StringBuilder sb = new StringBuilder();
sb.Append(xmlDocument.OuterXml);
UE = new UnicodeEncoding();
byte[] MessageBytes = UE.GetBytes(sb.ToString());
SHA1Managed SHhash = new SHA1Managed();
HashValue = SHhash.ComputeHash(MessageBytes);
foreach (byte b in HashValue)
{
newHash += b + " ";
}
string oldHash = PlayerPrefs.GetString("HashSave");
result = StringCompare(newHash, oldHash);
PlayerPrefs.SetString("HashSave", newHash);
return result;
}
bool StringCompare(string newHash, string oldHash)
{
int rezult= String.Compare(newHash, oldHash, true);
bool getBool = (rezult == 0) ? true : false;
return getBool;
}
}