Имея более 32 байтовых значений - PullRequest
0 голосов
/ 19 февраля 2019

Мне поручено создать систему разрешений с использованием побитовых операторов, и кто-то спросил меня, что если нам нужно более 32 разрешений, в настоящее время у нас есть это:

enum permissions {
    none = 0,
    Founder = 1 << 0,
    SeeAdmins = 1 << 1,
    EditAdmins = 1 << 2,
    SeeText = 1 << 3,
    EditText = 1 << 4,
    PublishWork = 1 << 5
}

Что является управляемым, но это не такНемыслимо, что мы добавим более 32, быстрый тест дал мне такие результаты:

1 << 30 = 1073741824
1 << 31 = -2147483648
1 << 32 = 1

Возможно ли даже иметь более 32 байтовых значений, подобных этому?

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

BingInt

1n << 64n
18446744073709551616n

BigInts поддерживает наиболее распространенные операторы.Двоичные +, -, * и ** все работают как положено./ и% работают, и округляют до нуля по мере необходимости.Побитовые операции |, &, <<, >> и ^ выполняют побитовую арифметику в предположении, что для отрицательных значений дополняют двоичное представление, как и для чисел.

https://developers.google.com/web/updates/2018/05/bigint

0 голосов
/ 19 февраля 2019

Количество разрешений в этом случае может быть практически бесконечным.Но это не включает двоичную маску , вам нужно подумать о том, как вы структурируете свои разрешения в вашей базе данных.

  1. Если разрешения (точнее, группа разрешений)) - это просто число, тогда двоичная маска - это путь.Поскольку он может уместиться в одно число
  2. Если вы хотите больше гибкости, просто назначьте случайные идентификаторы для разрешений.Затем создайте группы разрешений , которые имеют свои собственные идентификаторы.Таким образом, вы получаете практически бесконечное количество разрешений и элементов управления

Например, вы можете просто продолжать добавлять элементы в Permission enum , даже не задавая ему номер. Typescript преобразует это в автоматически увеличивающиеся числа .Например,

enum Permissions {
    none,
    Founder,
    SeeAdmins,
    EditAdmins,
    SeeText,
    EditText,
    PublishWork
}

На внешнем слое ваша "группа разрешений" может быть простым массивом разрешений

const accountantPermissionGroup = [
    Permissions.SeeTransactions,
    Permissions.WriteSomeReport,
    Permissions.MoveFunds
];
...