{"id":13595985,"url":"https://github.com/maciejczyzewski/libchaos","last_synced_at":"2025-05-16T13:02:55.357Z","repository":{"id":13559174,"uuid":"16251363","full_name":"maciejczyzewski/libchaos","owner":"maciejczyzewski","description":"Advanced library for randomization, hashing and statistical analysis (devoted to chaos machines). :microscope:","archived":false,"fork":false,"pushed_at":"2019-11-02T22:59:13.000Z","size":3249,"stargazers_count":1610,"open_issues_count":4,"forks_count":161,"subscribers_count":107,"default_branch":"master","last_synced_at":"2025-05-09T14:06:32.024Z","etag":null,"topics":["chaos-machines","crypto","hash","math","random"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/maciejczyzewski.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2014-01-26T10:40:03.000Z","updated_at":"2025-05-05T04:32:21.000Z","dependencies_parsed_at":"2022-09-11T10:41:23.406Z","dependency_job_id":null,"html_url":"https://github.com/maciejczyzewski/libchaos","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maciejczyzewski%2Flibchaos","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maciejczyzewski%2Flibchaos/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maciejczyzewski%2Flibchaos/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maciejczyzewski%2Flibchaos/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/maciejczyzewski","download_url":"https://codeload.github.com/maciejczyzewski/libchaos/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254535826,"owners_count":22087398,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["chaos-machines","crypto","hash","math","random"],"created_at":"2024-08-01T16:02:03.526Z","updated_at":"2025-05-16T13:02:55.284Z","avatar_url":"https://github.com/maciejczyzewski.png","language":"C++","funding_links":[],"categories":["C++"],"sub_categories":[],"readme":"\u003ca href=\"https://github.com/maciejczyzewski/libchaos\"\u003e\n    \u003cimg src=\"http://maciejczyzewski.me/libchaos/_static/libchaos.svg\" alt=\"libchaos\"\n         title=\"libchaos\" align=\"right\" width=\"100\" height=\"100\" /\u003e\n\u003c/a\u003e\n[![Current Release](https://img.shields.io/github/release/maciejczyzewski/libchaos.svg)](https://github.com/maciejczyzewski/libchaos/releases)\n[![Build Status](https://travis-ci.org/maciejczyzewski/libchaos.svg?branch=master)](https://travis-ci.org/maciejczyzewski/libchaos)\n\n[Features](#features) |\n[Overview](#overview) |\n[Installation](#installation) |\n[User Guide](#user-guide) |\n[Contributing](#contributing) |\n[License](#license)\n\n**Got a question?** Join us on [stackoverflow](http://stackoverflow.com/questions/tagged/libchaos) or chat on [IRC](https://webchat.freenode.net/?channels=#libchaos).\n\n*Advanced library for randomization, hashing and statistical analysis (devoted to [chaos machines](https://en.wikipedia.org/wiki/Chaos_machine)).*\n\n---\n\nLibchaos is a computing library written in the C++ language to help with the development of software for scientific research. The library tries to be as general as possible, modern and easy-to-use.\n\nProject goal is to *implement \u0026 analyze* various algorithms for randomization and hashing, while maintaining simplicity and security, making them suitable for use in your own code. Popular tools like [TestU01](http://simul.iro.umontreal.ca/testu01/tu01.html), [Dieharder](https://www.phy.duke.edu/~rgb/General/dieharder.php) and [Hashdeep](https://github.com/jessek/hashdeep) are obsolete or their development has been stopped. Libchaos aims to replace them.\n\n---\n\nThe library implements wide range of [chaos machines](#chaos-machines-theorypdf), which present the idea of creating a universal scheme with modular design and customizable parameters, which can be applied wherever *randomness* and *sensitiveness* is needed (pseudo-random oracle).\n\n```C++\nstd::string hash = chaos::password\u003cCHAOS_MACHINE_XORRING64, 500, 50, 95\u003e(\"my password\", \"private salt\");\n// hash == \"EA79560A7E0937EC66BDBE22EAFDC96AA5D7AFE4E970C3C856B7D92632EAA8EEC828E61E59E024922F58D4045BC053E\"\n```\n\nIt turns out that a pseudo-random function can be easily enriched by a [chaotic system](https://en.wikipedia.org/wiki/Chaos_theory), creating something completely new. What's interesting is that this scheme allows specification by three parameters: *execution time*, *period/memory required*, *initial secret key*.\n\n---\n\n**Getting Help**\n\nIf you have questions about the library, please be sure to check out the [API documentation](#). If you still have questions, reach out to us on [IRC](https://webchat.freenode.net/?channels=#libchaos) or post a question on [stackoverflow](http://stackoverflow.com/questions/tagged/libchaos) (using the ``libchaos`` tag).\n\n**Reporting Bugs**\n\nPlease open a [GitHub Issue](https://github.com/maciejczyzewski/libchaos/issues) and include as much information as you can. If possible, provide sample code that illustrates the problem you're reporting. If you're seeing a bug only on a specific repository, please provide a link to it if possible.\n\n*Do not open a GitHub Issue for help, only for bug reports.*\n\nFeatures\n========\n\n\u003ctable width=\"100%\"\u003e\n\u003ctr\u003e\n\u003cth width=\"30%\"\u003eReady\u003c/th\u003e\n\u003cth width=\"30%\"\u003eIn Progress\u003c/th\u003e\n\u003cth width=\"30%\"\u003eTODO\u003c/th\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eChaos machines\u003c/td\u003e\n\u003ctd\u003eStatistical tests \u0026 functions\u003c/td\u003e\n\u003ctd\u003eEntropy pools (different seeding scenarios)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePseudo-random number generators\u003c/td\u003e\n\u003ctd\u003eAdapter for truely random generators (dynamical reseeding)\u003c/td\u003e\n\u003ctd\u003eGnuplot/R utilities \u0026 analysis\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSignatures for algorithms (portability on various architectures)\u003c/td\u003e\n\u003ctd\u003eRanking for algorithms (speed/quality)\u003c/td\u003e\n\u003ctd\u003eJavascript API\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSTL compatibility\u003c/td\u003e\n\u003ctd\u003eHashdeep fork (named chaosdeep)\u003c/td\u003e\n\u003ctd\u003eSeed recovery (attacks)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\nOverview\n========\n\n![benchmark](http://maciejczyzewski.me/libchaos/_images/benchmark.svg)\n\nEach software problem requires different tools and algorithms to solve it effectively and achieve best results. *Engineer's problem is how to decide which method will suit his needs best.*\n\n\u003ctable width=\"100%\"\u003e\n\u003ctr\u003e\n\u003cth width=\"50%\"\u003eExample\u003c/th\u003e\n\u003cth width=\"50%\"\u003eInstructions\u003c/th\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cpre\u003e#include \u0026lt;iostream\u0026gt;\n#include \u0026lt;chaos.h\u0026gt;  // library header\n\n// initialize chaos machine (64-bit version)\nCHAOS_MACHINE_XORRING64 machine;\n\nint main(void) {\n  machine.set_space(100000); // 2^6400000 period length\n  machine.push(0x8a5cd789635d2dff);    // add some data\n  machine.push(0x284600e3f30e38c3);     // and other...\n  while (true) putc_unlocked(machine.pull(), stdout);\n}\u003c/pre\u003e\u003c/td\u003e\n\u003ctd\u003e\nJust copy, paste it into new file and prompt:\n\n\u003cbr\u003e\u003cbr\u003e\u003cpre\u003e$ g++ -std=c++11 -lchaos example.cc\n$ ./a.out | xxd -l 1024\u003c/pre\u003e\n\nSee it run! Have fun.\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\nThis project offers very convenient interface for practical use, not just research. In the next section, there is a list of recommended algorithms and their strengths, period lengths, and speeds.\n\n\u003ctable width=\"100%\"\u003e\n\u003ctr\u003e\n\u003cth width=\"50%\"\u003eExample\u003c/th\u003e\n\u003cth width=\"50%\"\u003eInstructions\u003c/th\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cpre\u003e#include \u0026lt;iostream\u0026gt;\n#include \u0026lt;chaos.h\u0026gt;  // library header\n\n// initialize PRNG (by Sebastiano Vigna)\nCHAOS_PRNG_XOROSHIRO1024STAR prng;\n\nint main(void) {\n  prng.seed(0x8a5cd789635d2dff); // initialize with seed\n  while (true) putc_unlocked(prng.next(), stdout);\n}\u003c/pre\u003e\u003c/td\u003e\n\u003ctd\u003e\nNotice that you can use \u003ccode\u003eCHAOS_PRNG_*\u003c/code\u003e and \u003ccode\u003eCHAOS_MACHINE_*\u003c/code\u003e algorithms. See the table below and read the library user guide to understand the difference.\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\nChaos Machines [(theory/pdf)](https://eprint.iacr.org/2016/468)\n--------------\n\nIn mathematics, a chaos machine is a class of algorithms constructed on the base of chaos theory (mainly deterministic chaos) to produce **pseudo-random oracle**. It was designed specifically to combine the benefits of *hash function* and *pseudo-random function*.\n\n\u003ctable width=\"100%\"\u003e\n\u003ctr\u003e\n\u003cth rowspan=\"2\" width=\"100%\"\u003eName\u003c/th\u003e\n\u003cth rowspan=\"2\"\u003eInput\u003c/th\u003e\n\u003cth rowspan=\"2\"\u003eOutput\u003c/th\u003e\n\u003cth rowspan=\"2\"\u003ePeriod\u003c/th\u003e\n\u003cth rowspan=\"2\"\u003eQuality\u003c/th\u003e\n\u003cth colspan=\"2\"\u003eSpeed\u003c/th\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003cth\u003ePush\u003c/th\u003e\u003cth\u003ePull\u003c/th\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eCHAOS_MACHINE_NCG\u003c/code\u003e proof of concept\u003c/td\u003e\n\u003ctd\u003euint32_t\u003c/td\u003e\n\u003ctd\u003euint32_t\u003c/td\u003e\n\u003ctd\u003e(2\u003csup\u003e16n\u003c/sup\u003e,2\u003csup\u003e32n\u003c/sup\u003e)\u003c/td\u003e\n\u003ctd\u003ehigh\u003c/td\u003e\n\u003ctd\u003e4.38007M\u003cbr\u003eitems/s\u003c/td\u003e\n\u003ctd\u003e3.49098M\u003cbr\u003eitems/s\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eCHAOS_MACHINE_XORRING32\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003euint32_t\u003c/td\u003e\n\u003ctd\u003euint32_t\u003c/td\u003e\n\u003ctd\u003e2\u003csup\u003e32n\u003c/sup\u003e\u003c/td\u003e\n\u003ctd\u003ehigh\u003c/td\u003e\n\u003ctd\u003e33.0828M\u003cbr\u003eitems/s\u003c/td\u003e\n\u003ctd\u003e48.938M\u003cbr\u003eitems/s\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eCHAOS_MACHINE_XORRING64\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003euint64_t\u003c/td\u003e\n\u003ctd\u003euint64_t\u003c/td\u003e\n\u003ctd\u003e2\u003csup\u003e64n\u003c/sup\u003e\u003c/td\u003e\n\u003ctd\u003ehigh\u003c/td\u003e\n\u003ctd\u003e31.6051M\u003cbr\u003eitems/s\u003c/td\u003e\n\u003ctd\u003e41.6355M\u003cbr\u003eitems/s\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\nMachines can be used to implement many cryptographic primitives, including cryptographic hashes, message authentication codes and randomness extractors.\n\nPseudo-Random Number Generators\n-------------------------------\n\nPRNGs are algorithms for **generating a sequence of numbers** whose properties approximate the properties of sequences of random numbers. Generated sequence is **not truly random**, because it is completely determined by a relatively small set of initial values, called the seed.\n\n\u003ctable width=\"100%\"\u003e\n\u003ctr\u003e\n\u003cth width=\"30%\"\u003eName\u003c/th\u003e\n\u003cth\u003eSeed\u003c/th\u003e\n\u003cth\u003eOutput\u003c/th\u003e\n\u003cth\u003ePeriod\u003c/th\u003e\n\u003cth\u003eQuality\u003c/th\u003e\n\u003cth\u003eSpeed\u003c/th\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eCHAOS_PRNG_KISS\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003euint32_t [2]\u003c/td\u003e\n\u003ctd\u003euint32_t\u003c/td\u003e\n\u003ctd\u003e2\u003csup\u003e119.5\u003c/sup\u003e\u003c/td\u003e\n\u003ctd\u003ehigh\u003c/td\u003e\n\u003ctd\u003e99.9175M items/s\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eCHAOS_PRNG_ABYSSINIAN\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003euint32_t [2]\u003c/td\u003e\n\u003ctd\u003euint32_t\u003c/td\u003e\n\u003ctd\u003e2\u003csup\u003e126\u003c/sup\u003e\u003c/td\u003e\n\u003ctd\u003ehigh\u003c/td\u003e\n\u003ctd\u003e165.754M items/s\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eCHAOS_PRNG_XOROSHIRO128PLUS\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003euint64_t\u003c/td\u003e\n\u003ctd\u003euint64_t\u003c/td\u003e\n\u003ctd\u003e2\u003csup\u003e128\u003c/sup\u003e\u003c/td\u003e\n\u003ctd\u003ehigh\u003c/td\u003e\n\u003ctd\u003e178.426M items/s\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eCHAOS_PRNG_XOROSHIRO1024STAR\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003euint64_t\u003c/td\u003e\n\u003ctd\u003euint64_t\u003c/td\u003e\n\u003ctd\u003e2\u003csup\u003e1024\u003c/sup\u003e\u003c/td\u003e\n\u003ctd\u003ehigh\u003c/td\u003e\n\u003ctd\u003e165.289M items/s\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eCHAOS_PRNG_XORSHF96\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003euint32_t [3]\u003c/td\u003e\n\u003ctd\u003euint32_t\u003c/td\u003e\n\u003ctd\u003e2\u003csup\u003e96\u003c/sup\u003e - 1\u003c/td\u003e\n\u003ctd\u003ehigh\u003c/td\u003e\n\u003ctd\u003e185.148M items/s\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\n**STL Comparison**\n\nLibrary competes with PRNGs [from standard library](http://en.cppreference.com/w/cpp/numeric/random). Benchmarks [confirms](https://github.com/maciejczyzewski/libchaos/blob/master/tests/b_generators.cc#L68) that libchaos is faster and offers more...\n\n```\nBenchmark                                Time           CPU Iterations                   Speed (Travis)\n-------------------------------------------------------------------------------------------------------\nB__STL_MINSTD_RAND__Next               333 us        333 us       2108   1.46467GB/s   46.8694M items/s\nB__STL_MT19937__Next                   229 us        229 us       3074   2.13247GB/s    68.239M items/s\nB__STL_MT19937_64__Next                260 us        260 us       2683   1.87711GB/s   60.0674M items/s\nB__STL_RANLUX24__Next                 2326 us       2327 us        295   214.828MB/s   6.71339M items/s\nB__STL_RANLUX48__Next               118524 us     118598 us          6   67.4546MB/s   2.10796M items/s\nB__STL_KNUTH_B__Next                  1083 us       1084 us        641   461.418MB/s   14.4193M items/s\n```\n\nInstallation\n============\n\nThe library needs a C++ compiler that supports C++11. You will need *g++ 4.7* or newer to get started, so be sure to have an up-to-date compiler.\n\n\u003e **TODO.** Add this library to [Homebrew](http://brew.sh/). Then simply ``$ brew install libchaos`` to install this package on OS X. This is an idea for the future, to be realized when the library has a stable version.\n\nBasic Installation\n------------------\n\n```\n$ git clone git@github.com:maciejczyzewski/libchaos.git\n$ cd libchaos \u0026\u0026 ./install.sh\n```\n\nManual Installation\n-------------------\n\nWe welcome patches. If you plan to contribute a patch, you need to build library and its own tests, which has further requirements:\n\n- [Google Test](https://github.com/google/googletest) and [Google Benchmark](https://github.com/google/benchmark) (automatically downloaded as submodule)\n- [CMake](https://cmake.org/) in version *2.8.7* (library uses [C++11](http://www.stroustrup.com/C++11FAQ.html))\n\n```\n$ git clone --recursive git@github.com:maciejczyzewski/libchaos.git\n$ mkdir libchaos/build \u0026\u0026 cd \"$_\"\n$ cmake -DLIBCHAOS_ENABLE_TESTING=ON ..\n$ make \u0026\u0026 make install\n```\n\nUninstalling Library\n--------------------\n\nCMake creates a file called ``install_manifest.txt`` when executing the install target. This contains a list of all installed files.\n\n```\n$ make uninstall # where is install_manifest.txt\n```\n\nUser Guide\n==========\n\nThis page gives a good introduction to libchaos. It assumes you already have library installed. If you do not, head over to the [installation](#installation) section. More complicated examples are in [`examples/` directory](https://github.com/maciejczyzewski/libchaos/tree/master/examples).\n\n\u003e **Warning.** This project is at an early stage of development. The list of core features is not ready. Only main modules are documented. If you have some ideas, feel free to contribute.\n\nStructure\n---------\n\nDirectory structure and contents:\n\n| Directory                   | Purpose                                                                       |\n|-----------------------------|-------------------------------------------------------------------------------|\n| `deps/`                     | Contains non-installed 3rd-party code that library depends on.                |\n| `cmake/`                    | Miscellaneous helper code.                                                    |\n| `include/chaos/engines/`    | Implementations of chaos machines.                                            |\n| `include/chaos/generators/` | Implementations of pseudo-random number generators.                           |\n| `include/chaos/`            | Core library abstractions.                                                    |\n| `tests`                     | Benchmarks and tests (using [Google Test](https://github.com/google/googletest) and [Google Benchmark](https://github.com/google/benchmark)). |\n\nAlgorithms\n----------\n\nList of implemented algorithms is in the [`ALGORITHMS`](https://github.com/maciejczyzewski/libchaos/blob/master/ALGORITHMS) file.\n\n```C++\nCHAOS_MACHINE_* gen; // @1: for CMs\nCHAOS_PRNG_* gen;    // @2: for PRNGS\n```\n\n**Chaos Machines**\n\nSettings:\n\n```C++\ngen.set_time(4);      // time parameter\ngen.set_space(1000);  // memory parameter (period length)\n                      // initial secret key\ngen.set_key({0x84242f96eca9c41d, 0xa3c65b8776f96855, 0x5b34a39f070b5837,\n             0x4489affce4f31a1e, 0x2ffeeb0a48316f40, 0xdc2d9891fe68c022,\n             0x3659132bb12fea70, 0xaac17d8efa43cab8, 0xc4cb815590989b13,\n             0x5ee975283d71c93b, 0x691548c86c1bd540, 0x7910c41d10a1e6a5,\n             0x0b5fc64563b3e2a8, 0x047f7684e9fc949d, 0xb99181f2d8f685ca});\n```\n\nFor pushing a blob:\n\n```C++\ngen.push(a); // @1: using function (fastest)\ngen \u003c\u003c a;    // @2: using operator\n```\n\nFor getting a block:\n\n```C++\ngen.pull();  // @1: using function (fastest)\ngen \u003e\u003e a;    // @2: using operator\ngen();       // @3: STL style (for API)\n```\n\nFor clearing to initial state:\n\n```C++\ngen.reset();\n```\n\n**Pseudo-Random Number Generators**\n\nFor seeding:\n\n```C++\ngen.seed(a); // @1: using function (fastest)\ngen \u003c\u003c a;    // @2: using operator\n```\n\nFor getting a number:\n\n```C++\ngen.next();  // @1: using function (fastest)\ngen \u003e\u003e a;    // @2: using operator\ngen();       // @3: STL style (for API)\n```\n\n**Password Salting**\n\nFor salting passwords:\n\n```C++\nstd::string hash =\n    chaos::password\u003c\n        CHAOS_MACHINE_XORRING64,   // machine algorithm\n        time_parameter,            // computational consumption\n        space_parameter,           // memory required/space-hardness\n        output_size                // length of hashed password\n    \u003e(password, salt);\n```\n\nExample usage:\n\n```C++\nstd::string hash = chaos::password\u003cCHAOS_MACHINE_XORRING64, 200, 50, 40\u003e(\n    \"some secret password\", \"my private salt\");\n// hash == \"C6EB731977A6CB785196BAF11CA8BEC02CDEAFE8\"\n```\n\nContributing\n============\n\n\u003e Have you ever been fascinated by chaotic maps, fractals or something connected with disorder or randomness? Join us or support by sharing!\n\nOur work flow is a [typical GitHub flow](https://guides.github.com/introduction/flow/index.html), where contributors fork the [libchaos repository](https://github.com/maciejczyzewski/libchaos), make their changes on branch, and submit a [Pull Request](https://help.github.com/articles/using-pull-requests) (a.k.a. \"PR\"). Pull requests should usually be targeted at the `master` branch.\n\nPlease include a nice description of your changes when you submit your PR; if we have to read the whole diff to figure out why you're contributing, you're less likely to get feedback and have your change merged in. Life will be a lot easier for us if you follow this pattern (i.e. fork, named branch, submit PR). If you use your fork's `master` branch directly, things can get messy.\n\nBefore wrapping up a PR, you should be sure to:\n\n* Write tests to cover any functional changes.\n* Update documentation for any changed public APIs.\n* Add to the [CHANGELOG.md](https://raw.githubusercontent.com/maciejczyzewski/libchaos/master/CHANGELOG.md) file information describing any major changes.\n\nTesting \u0026 Benchmarking\n----------------------\n\nTo execute tests you need to build library manualy with option ``-DLIBCHAOS_ENABLE_TESTING=ON``.\n\n```bash\ntests/\n    - b_\u003cfilename\u003e.cc               # for benchmarking      |       BENCHMARK(TEST_NAME)\n    - t_\u003cfilename\u003e.cc               # for testing           |       TEST(TEST_NAME, CASE_NAME)\n```\n\nAfter ``make build``, repository should contains programs named as: ``bchaos`` and ``tchaos`` (separately for benchmark and test), because tests are *required* while benchmarks are *optional*.\n\nFuture Ideas\n------------\n\nIf you are starting to work on a particular area, feel free to submit a PR that highlights your work in progress (and note in the PR title that it's not ready to merge). These early PRs are welcome and will help in getting visibility for your fix, allow others to comment early on the changes and also let others know that you are currently working on something.\n\nLicense\n=======\n\nSee [`LICENSE`](https://github.com/maciejczyzewski/libchaos/blob/master/LICENSE) file in this repository.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaciejczyzewski%2Flibchaos","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmaciejczyzewski%2Flibchaos","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaciejczyzewski%2Flibchaos/lists"}