first commit - Hash32 done
This commit is contained in:
commit
65bcfbddbd
43
TestCppCode/main.cpp
Normal file
43
TestCppCode/main.cpp
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
#include <filesystem>
|
||||||
|
#include <fstream>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#include "../CodeDweller/mishmash.hpp"
|
||||||
|
|
||||||
|
std::string read_file(const std::string& filename) {
|
||||||
|
const auto size = std::filesystem::file_size(filename);
|
||||||
|
std::string results;
|
||||||
|
results.resize(size);
|
||||||
|
std::ifstream f{filename};
|
||||||
|
if (f.is_open()) {
|
||||||
|
f.read(results.data(), size);
|
||||||
|
f.close();
|
||||||
|
}
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<std::string> split(const std::string& s, const std::string& delimiter) {
|
||||||
|
std::vector<std::string> results{};
|
||||||
|
size_t position{}, previous{};
|
||||||
|
while ((position = s.find(delimiter, previous)) != std::string::npos) {
|
||||||
|
results.push_back(s.substr(previous, (position - previous)));
|
||||||
|
previous = position + delimiter.length();
|
||||||
|
}
|
||||||
|
if (previous < delimiter.length()) {
|
||||||
|
results.push_back(s.substr(previous));
|
||||||
|
}
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char** argv) {
|
||||||
|
if (argc <= 1) {
|
||||||
|
std::cout << "usage: give a dictionary/words file as an arg\n";
|
||||||
|
std::cout << "\t./test_cpp_code <path to words file>" << std::endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
const auto words = split(read_file(argv[1]), "\n");
|
||||||
|
for (const auto& word: words) {
|
||||||
|
const auto hash = codedweller::mishmash(word);
|
||||||
|
std::cout << word << "\t" << std::hex << std::setw(8) << std::setfill('0') << hash << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
104334
cppmishmash32.txt
Normal file
104334
cppmishmash32.txt
Normal file
File diff suppressed because it is too large
Load Diff
86
engine.go
Normal file
86
engine.go
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
package mishmash
|
||||||
|
|
||||||
|
type PrimeSet [256]uint32
|
||||||
|
|
||||||
|
func (p PrimeSet) Select(n uint64) uint32 {
|
||||||
|
return p[n&0xFF]
|
||||||
|
}
|
||||||
|
|
||||||
|
var ThePrimes = PrimeSet{
|
||||||
|
3825240899, 3652005211, 2966014067, 3432177659, 3109134187, 3139884271, 3108258589, 2277840529,
|
||||||
|
3748140223, 4206444373, 2684505017, 3883989821, 4076539213, 3880335997, 2603229667, 2358458953,
|
||||||
|
4061135443, 3826856503, 2671898833, 3266747401, 3403611587, 2483486933, 3889003891, 2820911959,
|
||||||
|
2318077829, 3470930861, 3231587809, 3225029887, 4123396483, 3422817119, 3612514831, 2170177423,
|
||||||
|
3058754837, 3000926393, 2825656217, 3387930461, 3532314017, 3245479361, 3466327211, 4080294503,
|
||||||
|
4252034179, 2302986211, 3394476707, 3697851029, 3957195257, 2862308587, 4285266071, 3681357247,
|
||||||
|
3157577413, 3839398561, 3097979117, 3590787463, 3354450497, 3110291879, 3938796493, 3196834463,
|
||||||
|
2374254481, 2702597567, 3046228397, 3461690719, 2641445467, 2401060583, 2483505539, 2775297373,
|
||||||
|
2262447391, 3118976533, 3014355683, 3355176449, 4055753381, 2277045713, 3098402119, 3894957487,
|
||||||
|
2770620887, 4125228329, 2575044467, 4162428989, 3294651817, 2308925797, 3698223103, 2150023273,
|
||||||
|
3075614681, 2410764047, 3624889381, 3264455489, 3241969651, 3001767217, 3407799859, 2998917373,
|
||||||
|
2629826653, 2714272271, 3987786247, 2880807353, 3608804803, 2231694917, 3790372403, 4156893413,
|
||||||
|
2563320007, 2423350621, 2735169119, 4021079791, 4150641413, 2907916357, 3772971647, 2481168307,
|
||||||
|
2842943119, 2234753693, 3966637117, 2732029457, 3207475039, 3533605151, 2349367747, 3336108011,
|
||||||
|
2431060103, 2263416899, 2350941683, 3869512277, 3880987697, 3062735029, 2512894603, 3669845519,
|
||||||
|
2235487739, 3201016501, 2438124943, 4170458909, 2938134889, 4231610087, 3187120061, 2378420137,
|
||||||
|
3365835877, 3078766697, 3704906059, 3541986781, 3969072823, 3510542281, 2306290751, 3898737419,
|
||||||
|
2898069347, 4092904481, 2484285403, 2721169823, 4293617527, 2928584759, 2213966141, 2335957513,
|
||||||
|
3367371923, 2965261109, 4175805451, 3541995157, 2964065479, 3997902791, 3053542259, 2168926237,
|
||||||
|
3253268639, 2620083509, 3314283407, 3873087809, 2636771209, 2737638653, 3209154931, 3414204793,
|
||||||
|
3451689091, 2638985941, 2899591693, 2654878441, 2748067627, 3395485733, 2679070523, 3100687721,
|
||||||
|
2520033701, 2980087373, 2873947007, 2565436501, 2400053783, 4163039563, 3517993571, 4263192407,
|
||||||
|
3385597069, 2768101117, 3502890653, 3092130347, 3748553827, 4109944849, 2418961109, 3398621741,
|
||||||
|
3073383031, 2167592489, 2950739053, 3529429811, 3167420899, 4254703357, 3344014309, 3725480141,
|
||||||
|
3745944539, 3456003191, 2832137237, 4202217191, 3730577581, 2837794231, 2155546451, 2539211039,
|
||||||
|
2256984649, 2458975411, 2986340839, 3412432363, 3596817463, 2973444983, 2409734297, 3273292601,
|
||||||
|
3302556869, 3630727567, 3670056499, 3300959521, 3949319809, 3047032057, 3412226563, 2147483647,
|
||||||
|
2914045411, 2882644273, 4065606553, 2735903059, 3195020617, 3887229457, 3232900987, 3409357867,
|
||||||
|
3037985513, 3162012463, 3340137193, 2186608547, 4018093523, 4153387103, 2566863161, 3087918809,
|
||||||
|
3332247019, 3579407009, 3082973791, 4178339461, 3269728331, 2270495261, 2400046513, 2641204147,
|
||||||
|
2593078337, 2398468271, 3861488311, 3766456459, 2970457213, 3491800771, 3797865553, 2756555203,
|
||||||
|
3154883449, 3782386073, 3324965471, 4088422453, 3784508591, 3903657481, 3010059277, 2936392909,
|
||||||
|
}
|
||||||
|
|
||||||
|
func Engine(b []byte, accumulator uint64, primes PrimeSet) uint64 {
|
||||||
|
for _, theByte := range b {
|
||||||
|
var accumulator1 uint64 = uint64(primes.Select(accumulator)) + uint64(theByte)
|
||||||
|
var accumulator2 uint64 = ^accumulator * uint64(primes.Select(uint64(theByte)))
|
||||||
|
var accumulator3 uint64 = accumulator >> (32 + ((theByte & 0x1F) ^ (theByte >> 5)))
|
||||||
|
accumulator = accumulator1 + accumulator2 + accumulator3
|
||||||
|
}
|
||||||
|
return accumulator
|
||||||
|
}
|
||||||
|
|
||||||
|
type Mishmash32 struct {
|
||||||
|
accumulator uint64
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *Mishmash32) Sum32() uint32 {
|
||||||
|
return uint32(m.accumulator & 0x00000000FFFFFFFF)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *Mishmash32) Write(b []byte) (int, error) {
|
||||||
|
m.accumulator = Engine(b, m.accumulator, ThePrimes)
|
||||||
|
return len(b), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *Mishmash32) Sum(b []byte) []byte {
|
||||||
|
return append(b,
|
||||||
|
byte(m.accumulator>>24),
|
||||||
|
byte(m.accumulator>>16),
|
||||||
|
byte(m.accumulator>>8),
|
||||||
|
byte(m.accumulator),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *Mishmash32) Reset() {
|
||||||
|
m.accumulator = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *Mishmash32) Size() int {
|
||||||
|
return 4
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *Mishmash32) BlockSize() int {
|
||||||
|
return 1
|
||||||
|
}
|
||||||
63
engine_test.go
Normal file
63
engine_test.go
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
package mishmash
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
const The32BitHashesFilename = "cppmishmash32.txt"
|
||||||
|
|
||||||
|
type WordWithHashString struct {
|
||||||
|
word, hash string
|
||||||
|
}
|
||||||
|
|
||||||
|
func ParseHashesFile(filename string) ([]WordWithHashString, error) {
|
||||||
|
f, err := os.Open(filename)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("error opening %s: %w", filename, err)
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
scanner := bufio.NewScanner(f)
|
||||||
|
results := make([]WordWithHashString, 0)
|
||||||
|
lineNumber := 0
|
||||||
|
for scanner.Scan() {
|
||||||
|
lineNumber++
|
||||||
|
line := strings.TrimSpace(scanner.Text())
|
||||||
|
if len(line) == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
fields := strings.Fields(line)
|
||||||
|
if len(fields) != 2 {
|
||||||
|
return nil, fmt.Errorf("error: malformed line %s at line %d", line, lineNumber)
|
||||||
|
}
|
||||||
|
results = append(results, WordWithHashString{fields[0], fields[1]})
|
||||||
|
}
|
||||||
|
return results, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAgainstCppMishmash32(t *testing.T) {
|
||||||
|
wordsWithHashes, err := ParseHashesFile(The32BitHashesFilename)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("error: %v\n", err)
|
||||||
|
}
|
||||||
|
start := time.Now()
|
||||||
|
for _, obj := range wordsWithHashes {
|
||||||
|
word, hashString := obj.word, obj.hash
|
||||||
|
want, err := strconv.ParseUint(hashString, 16, 32)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("error parsing %+v: %v\n", obj, err)
|
||||||
|
}
|
||||||
|
hasher := Mishmash32{}
|
||||||
|
hasher.Write([]byte(word))
|
||||||
|
got := hasher.Sum32()
|
||||||
|
if uint32(want) != got {
|
||||||
|
t.Fatalf("error for %q: wanted %08x; got %08x\n", word, want, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fmt.Printf("finished testing %d words after %s\n", len(wordsWithHashes), time.Since(start))
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user