summaryrefslogtreecommitdiffstats
path: root/krebs/4lib/genid.nix
diff options
context:
space:
mode:
authormakefu <github@syntax-fehler.de>2015-12-26 10:51:18 +0100
committermakefu <github@syntax-fehler.de>2015-12-26 10:51:18 +0100
commited4db71add7e279625e70be915b0cec47eb6be3e (patch)
tree195624e743f9e5e6bcc7c2ad2f5c66b00c08a3d7 /krebs/4lib/genid.nix
parentcef2be532b0cc76071b0b3515fc71214b37591f0 (diff)
parent763f0db52ad45eef6e09d7982cd0f6cd898857e3 (diff)
Merge remote-tracking branch 'cd/master'
Diffstat (limited to 'krebs/4lib/genid.nix')
-rw-r--r--krebs/4lib/genid.nix37
1 files changed, 37 insertions, 0 deletions
diff --git a/krebs/4lib/genid.nix b/krebs/4lib/genid.nix
new file mode 100644
index 000000000..0aed1d351
--- /dev/null
+++ b/krebs/4lib/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