summaryrefslogtreecommitdiffstats
path: root/lib/genid.nix
diff options
context:
space:
mode:
authortv <tv@krebsco.de>2016-10-20 20:21:59 +0200
committertv <tv@krebsco.de>2016-10-20 20:21:59 +0200
commit844d347ce7cf0b7646e9ecba3fbdc0b90e608501 (patch)
tree32827cb69265c117abee1654ae6cf581a9a5c87c /lib/genid.nix
parent91d6bd66f4d50d47692f55c16bfb14bdf4837520 (diff)
lib: import bulk of krebs/4lib
Diffstat (limited to 'lib/genid.nix')
-rw-r--r--lib/genid.nix37
1 files changed, 37 insertions, 0 deletions
diff --git a/lib/genid.nix b/lib/genid.nix
new file mode 100644
index 00000000..0aed1d35
--- /dev/null
+++ b/lib/genid.nix
@@ -0,0 +1,37 @@
+{ lib, ... }:
+with lib;
+with builtins;
+let out = genid;
+
+ # id = genid s = (hash s + min) % max
+ # min <= genid s < max
+ #
+ # min = 2^24 = 16777216 = 0x001000000
+ # max = 2^32 = 4294967296 = 0x100000000
+ #
+ # id is bigger than UID of nobody and GID of nogroup
+ # see <nixos/modules/misc/ids.nix> and some spare for stuff like lxd.
+ #
+ # :: str -> uint32
+ genid = s: sum16 (addmod16_16777216 (hash s));
+
+ # :: str -> list8 uint4
+ hash = s:
+ map hexint (stringToCharacters (substring 32 8 (hashString "sha1" s)));
+
+ # :: list uint -> uint
+ sum16 = foldl (a: i: a * 16 + i) 0;
+
+ # :: list8 uint4 -> list1 uint8 ++ list6 uint4
+ addmod16_16777216 = x: let
+ a = 16 * head x + head (tail x);
+ d = tail (tail x);
+ in [(mod (a + 1) 256)] ++ d;
+
+ # :: char -> uint4
+ hexint = x: hexvals.${toLower x};
+
+ # :: attrset char uint4
+ hexvals = listToAttrs (imap (i: c: { name = c; value = i - 1; })
+ (stringToCharacters "0123456789abcdef"));
+in out