什么是幂等运算?
当前回答
无论调用该操作多少次,结果都是相同的。
其他回答
无论调用该操作多少次,结果都是相同的。
如果一个操作执行多次等同于执行一次,那么它就是幂等的。
例如:将音量设置为20。 不管把电视的音量设置多少次为20,最终的结果都是20。即使一个进程执行该操作50/100次或更多,在进程结束时,卷也将为20。
反例:将音量增加1。如果一个进程执行该操作50次,则最终卷将为初始卷+ 50;如果一个进程执行该操作100次,则最终卷将为初始卷+ 100。正如您可以清楚地看到的,最终结果根据执行操作的次数而变化。因此,我们可以得出结论,这个运算不是幂等的。
我用粗体突出显示了最终结果。
如果你从编程的角度考虑,假设我有一个操作,其中一个函数f以foo作为输入,f的输出被设为foo。如果在进程结束时(执行此操作50/100次或更多次),我的foo变量保存的值是该操作只执行一次时的值,则该操作是幂等的,否则为NOT。
Foo = <某个随机值,比如-2>
{foo = f(foo)}花括号概括了该操作
如果f返回输入的平方,则运算不是幂等的。因为foo在最后会被(-2)提升到(执行操作次数)的次方
如果f返回输入的绝对值,则操作是幂等的,因为无论执行多少次操作,foo都将是abs(-2)。 这里,最终结果被定义为变量foo的最终值。
在数学意义上,幂等的含义略有不同: F (F (.... F (x))) = F (x) 这里f(x)的输出再次作为输入传递给f,这在编程中并不需要总是这样。
在计算中,幂等运算是指如果使用相同的输入参数多次调用它,则不会产生额外影响的运算。例如,从集合中移除一项可以被认为是集合上的幂等操作。
在数学中,幂等运算是指f(f(x)) = f(x)。例如,abs()函数是幂等的,因为对于所有x, abs(abs(x)) = abs(x)。
考虑到数学定义中的x代表一个对象的状态,而f是一个可能改变该对象的操作,可以调和这些略有不同的定义。例如,考虑Python集合及其discard方法。discard方法从集合中删除一个元素,如果该元素不存在,则不执行任何操作。所以:
my_set.discard(x)
与执行两次相同的操作具有完全相同的效果:
my_set.discard(x)
my_set.discard(x)
幂等操作经常用于网络协议的设计中,其中执行操作的请求保证至少发生一次,但也可能发生多次。如果操作是幂等的,那么执行两次或两次以上的操作是没有伤害的。
更多信息请参见维基百科关于幂等性的文章。
上面的答案之前有一些不正确和误导性的例子。下面的评论写在2014年4月之前,是指一个较旧的修订。
幂等运算可以重复任意次数,结果与只做一次是一样的。在算术中,一个数加零是幂等的。
幂等性在“RESTful”web服务的上下文中被讨论了很多。REST寻求最大限度地利用HTTP来为程序提供对web内容的访问,并且通常与基于soap的web服务进行设置,后者只是在HTTP请求和响应中隐藏远程过程调用样式的服务。
REST将web应用程序组织成“资源”(如Twitter用户或Flickr图像),然后使用POST、PUT、GET和DELETE这些HTTP动词来创建、更新、读取和删除这些资源。
Idempotence plays an important role in REST. If you GET a representation of a REST resource (eg, GET a jpeg image from Flickr), and the operation fails, you can just repeat the GET again and again until the operation succeeds. To the web service, it doesn't matter how many times the image is gotten. Likewise, if you use a RESTful web service to update your Twitter account information, you can PUT the new information as many times as it takes in order to get confirmation from the web service. PUT-ing it a thousand times is the same as PUT-ing it once. Similarly DELETE-ing a REST resource a thousand times is the same as deleting it once. Idempotence thus makes it a lot easier to construct a web service that's resilient to communication errors.
进一步阅读:Richardson和Ruby的RESTful Web服务(幂等性在103-104页讨论),以及Roy Fielding关于REST的博士论文。Fielding是HTTP 1.1 RFC-2616的作者之一,RFC-2616在9.1.2节中讨论了幂等性。
幂等操作:多次执行没有副作用的操作。 示例:从数据资源检索值并打印值的操作 非幂等操作:多次执行会造成伤害的操作。(当它们改变某些值或状态时) 示例:从银行账户提款的操作