zoukankan      html  css  js  c++  java
  • 由超市临时储物柜引发的一点设计随想...

    在超市看到一个好玩的东西,好吧是我少见多怪了,就是一个普普通的供顾客临时存放东西储物柜,不过跟我以前见过的不大一样,等人无聊的时候我就开始瞎想了,我见过的大概有这么几种:

    第一种是使用密码的,存物的时候先按“存”按钮,然后随机分配一个柜子,然后输入密码,这种应该是比较常见的,取的时候需要柜子号和密码认证身份。
    第二种是使用凭条的,先按存按钮,然后分配一个柜子再打印一个凭条(出凭条口),取的时候需要凭条(塞入读凭条口)。
    第三种是在图书馆看到的,这个就比较高端了,是使用的ID卡认证,是跟学校的一卡通关联起来的,存的时候刷一下,滴,开,取的时候刷一下,滴,开,都不带选择存还是取的,还是蛮智能的。

    来分析一下它们的工作原理(顺带yy一下如果是我的话我会怎么设计):
    第一种使用密码认证的,布局大致如下(不同厂商肯定会有所不同,但是想一下屏幕肯定都会在平均身高的肩膀位置吧,总不能屏幕位置跟膝盖对齐吧....):

    柜子布局_001

    使用凭条的大概长这样子:

    image

    ID卡认证的大概是这个样子:

    image

    我没接触过单片机,不知道这种东西代码怎么写,但是想来原理应该是差不读的,无非是资源分配和回收(而且还是单线程),首先应该确定的是:

    1.已分配资源的管理方式
    2.未分配资源的管理方式

    这里的资源指的是柜子,已分配的资源可以使用一个Map映射表:

    Map<使用者标识,柜子编号> map=new HashMap<>();

    未分配的柜子存储数据结构:

    Queue<柜子编号> queue=new Queue<>();

    初始状态下所有柜子都在未分配队列中,每当要分配的时候就看一下,如果队列为空的话说明柜子已经分配完了,否则的话就从队头分配一个柜子,同时增加一个<使用者身份标识,柜子编号>项,这应该是一个原子性操作:

    1.移除queue队头元素。
    2.增加map映射项。

    当然别忘了把柜子打开让人家把东西放进来。

    当取的时候也比较简单,就是从map中的keySet中找一下有没有对应的项,如果木有,你肯定是假冒的了,如果有的话,首先把柜子给人家打开让人先把东西取走,然后在取走关上柜子的时候执行如下操作:

    1.删除map中的对应的映射项。
    2.将<使用者标识,柜子编号>中的柜子编号插入到queue的队尾,这个柜子可以重新分配了。

    以上两步也应该是一个原子性操作。

    一个小小的临时储物柜分配系统的逻辑大致就是这个样子,我感觉我设计的还行哈微笑

    然后就是身份标识了,关于密码的没什么好说的,直接使用一个六位数的字符串就可以,使用密码标识的缺点是需要人脑记忆,记忆的部分包括柜子号和密码,忘了就惨了。

    使用凭条的就稍微高端一点了,知乎上曾经看到过一个问题是关于一张纸能存储的数据是多少,呃事实上这个储物柜我光看了一下并没去试,但猜想的话使用纸存储信息不外乎条形码或者二维码,使用二维码比较好一些,不只是因为二维码可以存储的信息比较多,还有一层是往里面塞凭条的时候鬼知道是怎么塞的,而二维码有残缺识别和自动定位,不怕不怕啦。好了既然确定了纸上如何存储信息,那么继续来考虑一下存储什么呢?只存储柜子编号行不行?好像不太行,毕竟伪造一个二维码太简单,如果有人伪造了所有的柜子号二维码信息岂不是可以直接一锅端...所以我们要想一个办法证明塞进来的这张凭条是从我们这里吐出去的凭条,所以在吐凭条的时候应该加上随机的字符串之类的作为标识信息,在取的时候凭着凭条上的<标识信息,柜子编号>就可以唯一的确定柜子了,如果是条形码存储的话就只存储随机的标识信息,只要保证这个标识信息随机且在当前系统唯一也可以正常工作,这样在一定程序上保证安全性(但是像我这样经常丢东西的如果不小心把凭条给丢了.....哭泣的脸)。

    使用ID卡的简直高端到不行,但是我左看右看上看下看(我真的仔细研究过这柜子还差点被当贼....o(╯□╰)o)都没找得到联网的地方,我猜这个使用ID卡并不是直接连到学校的数据库认证,而是每一张ID卡都有自己的标识,设计的话跟上面的差不多,只不过是将随机生成改为由ID卡自带,因为这个持久唯一(意思就是这卡有效期四年并且绝不可能重复),所以刷的时候如果当前没有映射的话就可以认定是存储,当前已经有映射的话就认定为取,就这么简单。我之所以得出这个推论是因为我试过,图书馆的每层楼都有这种存物柜,可以在不同的储物柜同时存东西。而之所以得出是队列结构,是因为我试了好多次之后总结出的规律,毕竟再牛逼的系统也经不住大量的数据分析....当数据量大到一定程度的时候,规律简直是自己跳出来。
    棱镜门 & 1984:使用ID卡的话应该收集用户的使用信息上报(要求严格一点的话就实时上报),这样可以结合报上来的信息和所处位置的摄像头确定谁谁谁在什么时间什么地点几号柜子放了一件什么东西,他当时穿的什么衣服,梳的什么发型,脸上什么表情.....我靠光想想就毛骨悚然、

    参考资料: 以现有技术,一张70gA4纸单面可以存储多少字节数据?

  • 相关阅读:
    LeetCode15 3Sum
    LeetCode10 Regular Expression Matching
    LeetCode20 Valid Parentheses
    LeetCode21 Merge Two Sorted Lists
    LeetCode13 Roman to Integer
    LeetCode12 Integer to Roman
    LeetCode11 Container With Most Water
    LeetCode19 Remove Nth Node From End of List
    LeetCode14 Longest Common Prefix
    LeetCode9 Palindrome Number
  • 原文地址:https://www.cnblogs.com/cc11001100/p/5936742.html
Copyright © 2011-2022 走看看