Comment puis-je générer une clé primaire par les propriétés de l'objet?
J'ai besoin de quelque chose comme Hash. Mais hachage stable;
4 Réponses :
GUID suffit pour vous. Si vous utilisez une colonne ID, juste un index, guid.newguid () vs. nouveau GUID () P>
Cependant, si vous trouvez des valeurs d'objet après le décryptage du hachage, vous pouvez vérifier; p>
guid.newguid () code> générerait un excellent hash pour vous. P>
guid.newguid () fait un gestionnaire réel avec une valeur unique, ce que vous voulez probablement. code> p>
Pas de liaison aux propriétés. J'ai besoin de répétabilité.
Vous souhaitez générer des clés principales en fonction d'autres valeurs de propriétés, vous devez générer différentes valeurs de hachage à partir de ces deux valeurs de propriétés dans getStableHash code> méthode.
public class Object1
{
public Object1(string property1, DateTime property2)
{
Property1 = property1;
Property2 = property2;
StableHashID = GetStableHash();
}
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
public int StableHashID { get; private set; }
public string Property1 { get; private set; }
public DateTime Property2 { get; private set; }
public int GetStableHash()
{
var result = default(byte[]);
using (var stream = new MemoryStream())
{
using (var writer = new BinaryWriter(stream, Encoding.UTF8, true))
{
writer.Write(Property2.Ticks);
writer.Write(Property1);
writer.Write(Guid.NewGuid().ToString());
}
stream.Position = 0;
using (var hash = SHA256.Create())
{
result = hash.ComputeHash(stream);
}
}
return BitConverter.ToInt32(result, 0);
}
Je trouve une autre solution.
public override int GetStableHash() { int result = GetDeterministicHashCode(ErrorCode.ToString()); result = (result * 397) ^ (GetDeterministicHashCode(Property1.ToString())); result = (result * 397) ^ (GetDeterministicHashCode(Property2.ToString())); return result; } // https://stackoverflow.com/questions/5154970/how-do-i-create-a-hashcode-in-net-c-for-a-string-that-is-safe-to-store-in-a private int GetDeterministicHashCode(string str) { unchecked { int hash1 = (5381 << 16) + 5381; int hash2 = hash1; for (int i = 0; i < str.Length; i += 2) { hash1 = ((hash1 << 5) + hash1) ^ str[i]; if (i == str.Length - 1) break; hash2 = ((hash2 << 5) + hash2) ^ str[i + 1]; } return hash1 + (hash2 * 1566083941); } }
Pouvez-vous expliquer mieux?
StableHashid doit être unique et calculé par des propriétés. Fonction Standart gethashcode renvoie différentes valeurs après le redémarrage de l'application. Donc, j'ai besoin de hachage stable dans la base de données pour les défautions de l'événement.
Les hachages ne sont pas uniques. Vous pouvez utiliser GUID incrémental avec
[DatabaseGenerated (génération de la base de donnéesOption)] code>. De plus, lorsque la base de données générée par la base de données, EF sera plus intelligent (par exemple créer des requêtes d'insertion et de mise à jour avec
Mise à jour (entité) code>). Hachage ne peut pas être "stable" au sens de l'unique
La seule raison d'utiliser un GUID car pk est au cas où vous auriez besoin de fusionner 2 bases de données à l'avenir. Un GUID PK est mesurable plus lent et prend plus d'espace disque. Pourquoi avez-vous besoin de le faire?