[{"data":1,"prerenderedAt":842},["ShallowReactive",2],{"blog:2007:calculating-elf-32-in-c-and-net":3,"blogMore-Development":828,"comments-calculating-elf-32-in-c-and-net":841},{"id":4,"title":5,"body":6,"category":810,"commentCount":87,"date":811,"description":812,"excerpt":813,"extension":814,"filenames":815,"hidden":816,"image":815,"meta":817,"minutes":61,"navigation":83,"path":818,"seo":819,"showCategory":815,"stem":820,"tags":821,"updated":815,"url":825,"wordCount":826,"__hash__":827},"content\u002Fblog\u002F2007\u002Fcalculating-elf-32-in-c-and-net.md","Calculating Elf-32 in C# and .NET",{"type":7,"value":8,"toc":808},"minimark",[9,23,32,798,804],[10,11,12],"blockquote",{},[13,14,15,16],"p",{},"GitHub has the ",[17,18,22],"a",{"href":19,"rel":20},"https:\u002F\u002Fgithub.com\u002Fdamieng\u002FDamienGKit\u002Fblob\u002Fmaster\u002FCSharp\u002FDamienG.Library\u002FSecurity\u002FCryptography\u002FElf32.cs",[21],"nofollow","latest version of Elf32",[13,24,25,26,31],{},"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 ",[17,27,30],{"href":28,"rel":29},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FExecutable_and_Linkable_Format",[21],"Executable and Linkable Format",".",[33,34,39],"pre",{"className":35,"code":36,"language":37,"meta":38,"style":38},"language-csharp shiki shiki-themes everforest-light dracula","using System;\nusing System.Security.Cryptography;\n\npublic class Elf32 : HashAlgorithm {\n  private UInt32 hash;\n\n  public Elf32() {\n    Initialize();\n  }\n\n  public override void Initialize() {\n    hash = 0;\n  }\n\n  protected override void HashCore(byte[] buffer, int start, int length) {\n    hash = CalculateHash(hash, buffer, start, length);\n  }\n\n  protected override byte[] HashFinal() {\n    byte[] hashBuffer = UInt32ToBigEndianBytes(hash);\n    this.HashValue = hashBuffer;\n    return hashBuffer;\n  }\n\n  public override int HashSize { get { return 32; } }\n\n  public static UInt32 Compute(UInt32 polynomial, UInt32 seed, byte[] buffer) {\n    return CalculateHash(seed, buffer, 0, buffer.Length);\n  }\n\n  private static UInt32 CalculateHash(UInt32 seed, byte[] buffer, int start, int size) {\n    UInt32 hash = seed;\n\n    for (int i = start; i \u003C size; i++)\n       unchecked {\n          hash = (hash \u003C\u003C 4) + buffer[i];\n          UInt32 work = (hash & 0xf0000000);\n          if (work != 0)\n             hash ^= (work >> 24);\n          hash &= ~work;\n       }\n    return hash;\n  }\n\n  private byte[] UInt32ToBigEndianBytes(UInt32 x) {\n    return new byte[] {\n       (byte)((x >> 24) & 0xff),\n       (byte)((x >> 16) & 0xff),\n       (byte)((x >> 8) & 0xff),\n       (byte)(x & 0xff)\n    };\n  }\n}\n","csharp","",[40,41,42,59,78,85,109,121,126,138,147,153,158,175,190,195,200,245,258,263,268,285,302,321,329,334,339,367,372,410,432,437,442,482,496,501,532,540,569,590,606,625,639,645,652,657,662,683,696,721,743,765,781,787,792],"code",{"__ignoreMap":38},[43,44,47,51,55],"span",{"class":45,"line":46},"line",1,[43,48,50],{"class":49},"smiwp","using",[43,52,54],{"class":53},"sjYfO"," System",[43,56,58],{"class":57},"s6Vpi",";\n",[43,60,62,64,66,68,71,73,76],{"class":45,"line":61},2,[43,63,50],{"class":49},[43,65,54],{"class":53},[43,67,31],{"class":57},[43,69,70],{"class":53},"Security",[43,72,31],{"class":57},[43,74,75],{"class":53},"Cryptography",[43,77,58],{"class":57},[43,79,81],{"class":45,"line":80},3,[43,82,84],{"emptyLinePlaceholder":83},true,"\n",[43,86,88,92,95,99,102,106],{"class":45,"line":87},4,[43,89,91],{"class":90},"s9HRq","public",[43,93,94],{"class":49}," class",[43,96,98],{"class":97},"sPLAf"," Elf32",[43,100,101],{"class":57}," : ",[43,103,105],{"class":104},"snuxY","HashAlgorithm",[43,107,108],{"class":57}," {\n",[43,110,112,115,118],{"class":45,"line":111},5,[43,113,114],{"class":90},"  private",[43,116,117],{"class":104}," UInt32",[43,119,120],{"class":57}," hash;\n",[43,122,124],{"class":45,"line":123},6,[43,125,84],{"emptyLinePlaceholder":83},[43,127,129,132,135],{"class":45,"line":128},7,[43,130,131],{"class":90},"  public",[43,133,98],{"class":134},"sS4Kt",[43,136,137],{"class":57},"() {\n",[43,139,141,144],{"class":45,"line":140},8,[43,142,143],{"class":134},"    Initialize",[43,145,146],{"class":57},"();\n",[43,148,150],{"class":45,"line":149},9,[43,151,152],{"class":57},"  }\n",[43,154,156],{"class":45,"line":155},10,[43,157,84],{"emptyLinePlaceholder":83},[43,159,161,163,166,170,173],{"class":45,"line":160},11,[43,162,131],{"class":90},[43,164,165],{"class":90}," override",[43,167,169],{"class":168},"sXAHl"," void",[43,171,172],{"class":134}," Initialize",[43,174,137],{"class":57},[43,176,178,181,184,188],{"class":45,"line":177},12,[43,179,180],{"class":57},"    hash ",[43,182,183],{"class":90},"=",[43,185,187],{"class":186},"s3Ipq"," 0",[43,189,58],{"class":57},[43,191,193],{"class":45,"line":192},13,[43,194,152],{"class":57},[43,196,198],{"class":45,"line":197},14,[43,199,84],{"emptyLinePlaceholder":83},[43,201,203,206,208,210,213,216,219,222,226,229,232,235,237,239,242],{"class":45,"line":202},15,[43,204,205],{"class":90},"  protected",[43,207,165],{"class":90},[43,209,169],{"class":168},[43,211,212],{"class":134}," HashCore",[43,214,215],{"class":57},"(",[43,217,218],{"class":168},"byte",[43,220,221],{"class":57},"[] ",[43,223,225],{"class":224},"s7cAX","buffer",[43,227,228],{"class":57},", ",[43,230,231],{"class":168},"int",[43,233,234],{"class":224}," start",[43,236,228],{"class":57},[43,238,231],{"class":168},[43,240,241],{"class":224}," length",[43,243,244],{"class":57},") {\n",[43,246,248,250,252,255],{"class":45,"line":247},16,[43,249,180],{"class":57},[43,251,183],{"class":90},[43,253,254],{"class":134}," CalculateHash",[43,256,257],{"class":57},"(hash, buffer, start, length);\n",[43,259,261],{"class":45,"line":260},17,[43,262,152],{"class":57},[43,264,266],{"class":45,"line":265},18,[43,267,84],{"emptyLinePlaceholder":83},[43,269,271,273,275,278,280,283],{"class":45,"line":270},19,[43,272,205],{"class":90},[43,274,165],{"class":90},[43,276,277],{"class":168}," byte",[43,279,221],{"class":57},[43,281,282],{"class":134},"HashFinal",[43,284,137],{"class":57},[43,286,288,291,294,296,299],{"class":45,"line":287},20,[43,289,290],{"class":168},"    byte",[43,292,293],{"class":57},"[] hashBuffer ",[43,295,183],{"class":90},[43,297,298],{"class":134}," UInt32ToBigEndianBytes",[43,300,301],{"class":57},"(hash);\n",[43,303,305,309,311,315,318],{"class":45,"line":304},21,[43,306,308],{"class":307},"sKO3f","    this",[43,310,31],{"class":57},[43,312,314],{"class":313},"sSKRk","HashValue",[43,316,317],{"class":90}," =",[43,319,320],{"class":57}," hashBuffer;\n",[43,322,324,327],{"class":45,"line":323},22,[43,325,326],{"class":49},"    return",[43,328,320],{"class":57},[43,330,332],{"class":45,"line":331},23,[43,333,152],{"class":57},[43,335,337],{"class":45,"line":336},24,[43,338,84],{"emptyLinePlaceholder":83},[43,340,342,344,346,349,352,355,358,361,364],{"class":45,"line":341},25,[43,343,131],{"class":90},[43,345,165],{"class":90},[43,347,348],{"class":168}," int",[43,350,351],{"class":57}," HashSize { ",[43,353,354],{"class":168},"get",[43,356,357],{"class":57}," { ",[43,359,360],{"class":49},"return",[43,362,363],{"class":186}," 32",[43,365,366],{"class":57},"; } }\n",[43,368,370],{"class":45,"line":369},26,[43,371,84],{"emptyLinePlaceholder":83},[43,373,375,377,380,382,385,387,390,393,395,397,400,402,404,406,408],{"class":45,"line":374},27,[43,376,131],{"class":90},[43,378,379],{"class":90}," static",[43,381,117],{"class":104},[43,383,384],{"class":134}," Compute",[43,386,215],{"class":57},[43,388,389],{"class":104},"UInt32",[43,391,392],{"class":224}," polynomial",[43,394,228],{"class":57},[43,396,389],{"class":104},[43,398,399],{"class":224}," seed",[43,401,228],{"class":57},[43,403,218],{"class":168},[43,405,221],{"class":57},[43,407,225],{"class":224},[43,409,244],{"class":57},[43,411,413,415,417,420,423,426,429],{"class":45,"line":412},28,[43,414,326],{"class":49},[43,416,254],{"class":134},[43,418,419],{"class":57},"(seed, buffer, ",[43,421,422],{"class":186},"0",[43,424,425],{"class":57},", buffer.",[43,427,428],{"class":313},"Length",[43,430,431],{"class":57},");\n",[43,433,435],{"class":45,"line":434},29,[43,436,152],{"class":57},[43,438,440],{"class":45,"line":439},30,[43,441,84],{"emptyLinePlaceholder":83},[43,443,445,447,449,451,453,455,457,459,461,463,465,467,469,471,473,475,477,480],{"class":45,"line":444},31,[43,446,114],{"class":90},[43,448,379],{"class":90},[43,450,117],{"class":104},[43,452,254],{"class":134},[43,454,215],{"class":57},[43,456,389],{"class":104},[43,458,399],{"class":224},[43,460,228],{"class":57},[43,462,218],{"class":168},[43,464,221],{"class":57},[43,466,225],{"class":224},[43,468,228],{"class":57},[43,470,231],{"class":168},[43,472,234],{"class":224},[43,474,228],{"class":57},[43,476,231],{"class":168},[43,478,479],{"class":224}," size",[43,481,244],{"class":57},[43,483,485,488,491,493],{"class":45,"line":484},32,[43,486,487],{"class":104},"    UInt32",[43,489,490],{"class":57}," hash ",[43,492,183],{"class":90},[43,494,495],{"class":57}," seed;\n",[43,497,499],{"class":45,"line":498},33,[43,500,84],{"emptyLinePlaceholder":83},[43,502,504,507,510,512,515,517,520,523,526,529],{"class":45,"line":503},34,[43,505,506],{"class":49},"    for",[43,508,509],{"class":57}," (",[43,511,231],{"class":168},[43,513,514],{"class":57}," i ",[43,516,183],{"class":90},[43,518,519],{"class":57}," start; i ",[43,521,522],{"class":90},"\u003C",[43,524,525],{"class":57}," size; i",[43,527,528],{"class":90},"++",[43,530,531],{"class":57},")\n",[43,533,535,538],{"class":45,"line":534},35,[43,536,537],{"class":49},"       unchecked",[43,539,108],{"class":57},[43,541,543,546,548,551,554,557,560,563,566],{"class":45,"line":542},36,[43,544,545],{"class":57},"          hash ",[43,547,183],{"class":90},[43,549,550],{"class":57}," (hash ",[43,552,553],{"class":90},"\u003C\u003C",[43,555,556],{"class":186}," 4",[43,558,559],{"class":57},") ",[43,561,562],{"class":90},"+",[43,564,565],{"class":313}," buffer",[43,567,568],{"class":57},"[i];\n",[43,570,572,575,578,580,582,585,588],{"class":45,"line":571},37,[43,573,574],{"class":104},"          UInt32",[43,576,577],{"class":57}," work ",[43,579,183],{"class":90},[43,581,550],{"class":57},[43,583,584],{"class":90},"&",[43,586,587],{"class":186}," 0xf0000000",[43,589,431],{"class":57},[43,591,593,596,599,602,604],{"class":45,"line":592},38,[43,594,595],{"class":49},"          if",[43,597,598],{"class":57}," (work ",[43,600,601],{"class":90},"!=",[43,603,187],{"class":186},[43,605,531],{"class":57},[43,607,609,612,615,617,620,623],{"class":45,"line":608},39,[43,610,611],{"class":57},"             hash ",[43,613,614],{"class":90},"^=",[43,616,598],{"class":57},[43,618,619],{"class":90},">>",[43,621,622],{"class":186}," 24",[43,624,431],{"class":57},[43,626,628,630,633,636],{"class":45,"line":627},40,[43,629,545],{"class":57},[43,631,632],{"class":90},"&=",[43,634,635],{"class":90}," ~",[43,637,638],{"class":57},"work;\n",[43,640,642],{"class":45,"line":641},41,[43,643,644],{"class":57},"       }\n",[43,646,648,650],{"class":45,"line":647},42,[43,649,326],{"class":49},[43,651,120],{"class":57},[43,653,655],{"class":45,"line":654},43,[43,656,152],{"class":57},[43,658,660],{"class":45,"line":659},44,[43,661,84],{"emptyLinePlaceholder":83},[43,663,665,667,669,671,674,676,678,681],{"class":45,"line":664},45,[43,666,114],{"class":90},[43,668,277],{"class":168},[43,670,221],{"class":57},[43,672,673],{"class":134},"UInt32ToBigEndianBytes",[43,675,215],{"class":57},[43,677,389],{"class":104},[43,679,680],{"class":224}," x",[43,682,244],{"class":57},[43,684,686,688,691,693],{"class":45,"line":685},46,[43,687,326],{"class":49},[43,689,690],{"class":49}," new",[43,692,277],{"class":168},[43,694,695],{"class":57},"[] {\n",[43,697,699,702,704,707,709,711,713,715,718],{"class":45,"line":698},47,[43,700,701],{"class":57},"       (",[43,703,218],{"class":168},[43,705,706],{"class":57},")((x ",[43,708,619],{"class":90},[43,710,622],{"class":186},[43,712,559],{"class":57},[43,714,584],{"class":90},[43,716,717],{"class":186}," 0xff",[43,719,720],{"class":57},"),\n",[43,722,724,726,728,730,732,735,737,739,741],{"class":45,"line":723},48,[43,725,701],{"class":57},[43,727,218],{"class":168},[43,729,706],{"class":57},[43,731,619],{"class":90},[43,733,734],{"class":186}," 16",[43,736,559],{"class":57},[43,738,584],{"class":90},[43,740,717],{"class":186},[43,742,720],{"class":57},[43,744,746,748,750,752,754,757,759,761,763],{"class":45,"line":745},49,[43,747,701],{"class":57},[43,749,218],{"class":168},[43,751,706],{"class":57},[43,753,619],{"class":90},[43,755,756],{"class":186}," 8",[43,758,559],{"class":57},[43,760,584],{"class":90},[43,762,717],{"class":186},[43,764,720],{"class":57},[43,766,768,770,772,775,777,779],{"class":45,"line":767},50,[43,769,701],{"class":57},[43,771,218],{"class":168},[43,773,774],{"class":57},")(x ",[43,776,584],{"class":90},[43,778,717],{"class":186},[43,780,531],{"class":57},[43,782,784],{"class":45,"line":783},51,[43,785,786],{"class":57},"    };\n",[43,788,790],{"class":45,"line":789},52,[43,791,152],{"class":57},[43,793,795],{"class":45,"line":794},53,[43,796,797],{"class":57},"}\n",[13,799,800],{},[801,802,803],"em",{},"[)amien",[805,806,807],"style",{},"html pre.shiki code .smiwp, html code.shiki .smiwp{--shiki-default:#F85552;--shiki-dark:#FF79C6}html pre.shiki code .sjYfO, html code.shiki .sjYfO{--shiki-default:#DF69BA;--shiki-default-font-style:inherit;--shiki-dark:#8BE9FD;--shiki-dark-font-style:italic}html pre.shiki code .s6Vpi, html code.shiki .s6Vpi{--shiki-default:#5C6A72;--shiki-dark:#F8F8F2}html pre.shiki code .s9HRq, html code.shiki .s9HRq{--shiki-default:#F57D26;--shiki-dark:#FF79C6}html pre.shiki code .sPLAf, html code.shiki .sPLAf{--shiki-default:#3A94C5;--shiki-dark:#8BE9FD}html pre.shiki code .snuxY, html code.shiki .snuxY{--shiki-default:#3A94C5;--shiki-default-font-style:inherit;--shiki-dark:#8BE9FD;--shiki-dark-font-style:italic}html pre.shiki code .sS4Kt, html code.shiki .sS4Kt{--shiki-default:#8DA101;--shiki-dark:#50FA7B}html pre.shiki code .sXAHl, html code.shiki .sXAHl{--shiki-default:#3A94C5;--shiki-dark:#FF79C6}html pre.shiki code .s3Ipq, html code.shiki .s3Ipq{--shiki-default:#DF69BA;--shiki-dark:#BD93F9}html pre.shiki code .s7cAX, html code.shiki .s7cAX{--shiki-default:#5C6A72;--shiki-default-font-style:inherit;--shiki-dark:#FFB86C;--shiki-dark-font-style:italic}html pre.shiki code .sKO3f, html code.shiki .sKO3f{--shiki-default:#DF69BA;--shiki-default-font-style:inherit;--shiki-dark:#BD93F9;--shiki-dark-font-style:italic}html pre.shiki code .sSKRk, html code.shiki .sSKRk{--shiki-default:#35A77C;--shiki-dark:#F8F8F2}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":38,"searchDepth":61,"depth":61,"links":809},[],"Development","2007-11-24T17:18:21+00:00","A C# implementation of the elf_hash function used by the Executable and Linkable Format, packaged as a System.Security.Cryptography.HashAlgorithm subclass.","[object Object]","md",null,false,{},"\u002Fblog\u002F2007\u002Fcalculating-elf-32-in-c-and-net",{"title":5,"description":812},"blog\u002F2007\u002Fcalculating-elf-32-in-c-and-net",[822,823,824],".NET","C#","hashing","\u002Fblog\u002F2007\u002Fcalculating-elf-32-in-c-and-net\u002F",386,"weGlJOh4IlXJB6uxTYQWbrWV0KPNF28csY_IwZL8ETQ",[829,833,837],{"title":830,"date":831,"url":832},"Transactions in the MongoDB EF Core Provider","2025-10-25","\u002Fblog\u002F2025\u002Fmongodb-explicit-transactions\u002F",{"title":834,"date":835,"url":836},"Queryable Encryption with the MongoDB EF Core Provider","2025-09-22","\u002Fblog\u002F2025\u002Fmongodb-queryable-encryption\u002F",{"title":838,"date":839,"url":840},"Lazy Loading with EF Core Proxies","2025-04-02","\u002Fblog\u002F2025\u002Fef-proxies\u002F",[],1780900529495]