Calculating Elf-32 in C# and .NET
- š
- š 321 words
- š 2 minutes
- š¦ .NET
- š·ļø C#, hashing
- š¬ 4 responses
GitHub has the latest version ofĀ Elf32
Because you can never have enough hashing algorithms at your disposal this one is compatible with the elf_hash function that forms part ofĀ the Executable and LinkableĀ Format.
using System;
using System.Security.Cryptography;
public class Elf32 : HashAlgorithm {
private UInt32 hash;
public Elf32() {
Initialize();
}
public override void Initialize() {
hash = 0;
}
protected override void HashCore(byte[] buffer, int start, int length) {
hash = CalculateHash(hash, buffer, start, length);
}
protected override byte[] HashFinal() {
byte[] hashBuffer = UInt32ToBigEndianBytes(hash);
this.HashValue = hashBuffer;
return hashBuffer;
}
public override int HashSize { get { return 32; } }
public static UInt32 Compute(UInt32 polynomial, UInt32 seed, byte[] buffer) {
return CalculateHash(seed, buffer, 0, buffer.Length);
}
private static UInt32 CalculateHash(UInt32 seed, byte[] buffer, int start, int size) {
UInt32 hash = seed;
for (int i = start; i < size; i++)
unchecked {
hash = (hash << 4) + buffer[i];
UInt32 work = (hash & 0xf0000000);
if (work != 0)
hash ^= (work >> 24);
hash &= ~work;
}
return hash;
}
private byte[] UInt32ToBigEndianBytes(UInt32 x) {
return new byte[] {
(byte)((x >> 24) & 0xff),
(byte)((x >> 16) & 0xff),
(byte)((x >> 8) & 0xff),
(byte)(x & 0xff)
};
}
}
[)amien
4 responses to Calculating Elf-32 in C# and .NET
All hash functions can return the same hash code for a different input sets. If they didnāt they would instead be very effective compressionĀ algorithms.
hi Damien,
Can this algorithmĀ duplicate?
hash code of āmj9dā and āoj9fā is theĀ same.
regards, Canh
Yeah you are probably right. I will reviseĀ it.
Makes me wonder if it costs more to avoid this than to just do it anyway when work==0? As it has no effect on hash when work==0, and Iām almost certain itāll always be slower toĀ branch.