Last active
March 17, 2021 02:21
-
-
Save bbqchickenrobot/348a40a0a5ce2833f9430b372a43d89d to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| public class Hasher | |
| { | |
| protected int num = 0; | |
| protected int len = 0; | |
| protected readonly IEnumerable<object> dict = new List<object>(); | |
| public static object it(object data, int len=32, string format="utf8", IEnumerable<object> dict=null) | |
| { | |
| var hash = create(len, dict); | |
| hash.update((IEnumerable<object>) data); | |
| return hash.digest(format); | |
| } | |
| public static char[] getdict() | |
| { | |
| return new char[] | |
| { | |
| 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', | |
| 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', '1', '2', '3', '4', '5', '6', '7', '8', '9' | |
| }; | |
| } | |
| public static Hasher create(int len, IEnumerable<object> dict) | |
| { | |
| return new Hasher(len: len, dict: dict); | |
| } | |
| public int int32(string data="", int num=0, int min=1000000) | |
| { | |
| //data = String(data) | |
| for (var ii = 0; ii < data.Length; ii++) | |
| { | |
| var c = data[ii]; | |
| num = ((num << 5) - num) + c; | |
| num = num & num; | |
| } | |
| if (Math.Abs(num) >= min) | |
| return num; | |
| var top = 101; | |
| var primes = new Stack<int>(); | |
| for (var limit = 1; limit <= top; limit++) | |
| { | |
| var aa = false; | |
| for(var ii = 2; ii <= limit; ii++) | |
| if (limit % ii == 0 && ii != limit) | |
| aa = true; | |
| if (!aa) | |
| primes.Push(limit); | |
| } | |
| while (Math.Abs(num) < min) | |
| num *= primes.Pop(); | |
| return num; | |
| } | |
| public Hasher(int len, IEnumerable<object> dict) | |
| { | |
| num = 0; | |
| this.len = len; | |
| this.dict = (List<object>) (dict ?? new List<object>()); | |
| } | |
| public static Hasher int32(IEnumerable<object> data, int num) | |
| { | |
| var arr = data.ToArray().ToArray(); | |
| return new(data.Count(), arr); | |
| } | |
| public void update(IEnumerable<object> data) | |
| { | |
| this.num = int32(data, this.num).GetHashCode(); | |
| } | |
| public object digest(string format = "utf8") | |
| { | |
| if (format == "int32") | |
| return this.num; | |
| var hash = ""; | |
| var num = this.num; | |
| for (var ii = 0; ii < this.len; ii++) | |
| { | |
| num = this.int32(num: num); | |
| var index = num % this.dict.Count(); | |
| var range = index..0; | |
| hash += index > 0 ? this.dict.ToArray()[index] : this.dict.ToArray()[range]; | |
| } | |
| if (format == "utf8") | |
| return hash; | |
| else if (format == "hex") | |
| { | |
| var hex = new StringBuilder(); | |
| for (var ii = 0; ii < hash.Length; ii++) | |
| { | |
| //hex += Buffer.from(hash[ii]).toString('hex'); | |
| // todo - convert to hash | |
| hex.Append(BitConverter.ToString(new[] {Convert.ToByte(hash[ii])})); | |
| } | |
| return hex; | |
| } | |
| throw new Exception($"invalid format ${format}"); | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment